如何用django生成博客系统出问题:Reverse for 'archives' with arguments '('', '')' not found?

问题遇到的现象和发生背景

环境:python3.10+django3.2.13
问题描述:

http://localhost:8001/login/

本地登录页正常,登录后跳转到index.html出错。

问题相关代码,请勿粘贴截图

1、index.html引用的base.html相关部分:(index.html代码已经在下面的回复中做了补充)

 <div class="panel-body">
                        {% archives as date_list %}
                        <ul>
                            {% for date in date_list %}
                            <li>
                                <a href="{% url 'blog:archives' date.year date.month %}">
                                    {{ date.year }}{{ date.month }}</a>
                            </li>
                            {% empty %}
                            暂无归档!
                            {% endfor %}
                        </ul>
                    </div>

2、views.py中的

def archives(request, year, month):
   blog_list = models.Blog.objects.filter(created_time__year=year, created_time__month=month).order_by('-created_time')
   return render(request, 'blog/index.html', context={'blog_list':blog_list})

3、blog\url.py中的patterns设置:

 from django.urls import path,re_path
from . import views
app_name = 'blog'
urlpatterns = [
    path('',views.indexview.as_view(),name='index'),
    path('myindex/<int:loguserid>/',views.myindex.as_view(),name='myindex'),
    path('authorindex/<int:id>/',views.authorindex.as_view(),name='authorindex'),
    re_path('blog/(?P<pk>[0-9]+)/',views.blogdetailview.as_view(),name='detail'),
    re_path('archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/', views.archives, name='archives'),
    re_path('category/(?P<pk>[0-9]+)/', views.categoryview.as_view(), name='category'),
    re_path('tag/(?P<pk>[0-9]+)/', views.tagview.as_view(), name='tag'),
    path('search/', views.search, name='search'),
    path('login/', views.login,name='login'),
    path('registe/', views.registe,name='registe'),
    path('logout/',views.logout,name='logout'),
    path('test_ckeditor_front/',views.test_ckeditor_front),
]

运行结果及报错内容

NoReverseMatch at /
Reverse for 'archives' with arguments '('', '')' not found. 1 pattern(s) tried: ['archives/(?P[0-9]{4})/(?P[0-9]{1,2})/']
Request Method: GET
Request URL: http://localhost:8001/
Django Version: 3.2.13
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'archives' with arguments '('', '')' not found. 1 pattern(s) tried: ['archives/(?P[0-9]{4})/(?P[0-9]{1,2})/']
Exception Location: D:\mysite\gtu\lib\site-packages\django\urls\resolvers.py, line 698, in _reverse_with_prefix
Python Executable: D:\mysite\gtu\Scripts\python.exe
Python Version: 3.10.4
Python Path:
['D:\mysite\gtu_blog',
'D:\Program Files\Python310\python310.zip',
'D:\Program Files\Python310\DLLs',
'D:\Program Files\Python310\lib',
'D:\Program Files\Python310',
'D:\mysite\gtu',
'D:\mysite\gtu\lib\site-packages']
Server time: Wed, 27 Apr 2022 21:44:37 +0800
Error during template rendering
In template D:\mysite\gtu_blog\templates\base.html, error at line 140

Reverse for 'archives' with arguments '('', '')' not found. 1 pattern(s) tried: ['archives/(?P[0-9]{4})/(?P[0-9]{1,2})/']

130                            </div>
131                        </div>
132                    </div>
133                    <div class="panel panel-default">
134                        <div class="panel-heading">归档</div>
135                        <div class="panel-body">
136                            {% archives as date_list %}
137                            <ul>
138                                {% for date in date_list %}
139                                <li>
140                                    <a href="{% url 'blog:archives' date.year date.month %}">
141                                        {{ date.year }} 年 {{ date.month }}月</a>
142                                </li>
143                                {% empty %}
144                                暂无归档!
145                                {% endfor %}
146                            </ul>
147                        </div>
148                    </div>
149    
150                    {% endblock toc %}

Traceback Switch to copy-and-paste view
D:\mysite\gtu\lib\site-packages\django\core\handlers\exception.py, line 47, in inner
response = get_response(request) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\core\handlers\base.py, line 204, in _get_response
response = response.render() …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\response.py, line 105, in render
self.content = self.rendered_content …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\response.py, line 83, in rendered_content
return template.render(context, self._request) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\backends\django.py, line 61, in render
return self.template.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 170, in render
return self._render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 162, in _render
return self.nodelist.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\loader_tags.py, line 150, in render
return compiled_parent._render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 162, in _render
return self.nodelist.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\loader_tags.py, line 62, in render
result = block.nodelist.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 938, in render
bit = node.render_annotated(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\defaulttags.py, line 214, in render
nodelist.append(node.render_annotated(context)) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\base.py, line 905, in render_annotated
return self.render(context) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\template\defaulttags.py, line 449, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\urls\base.py, line 86, in reverse
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs) …
▶ Local vars
D:\mysite\gtu\lib\site-packages\django\urls\resolvers.py, line 698, in _reverse_with_prefix
raise NoReverseMatch(msg) …
▶ Local vars

我的解答思路和尝试过的方法

1、检查index.html及base.html;
2、检查archives函数;
3、检查urls.py设置;

我想要达到的结果

正常出现博客首页。

index.html代码:

{% extends 'base.html' %}
{% block main %}
{% if error_msg %}
<p>{{ error_msg }}</p>
{% endif %}
{% for blog in blog_list %}
<div class="media">
    <div class="media-left">
        <a href="{% url 'blog:authorindex' blog.author.id %}">
            <img class="media-object" src="/media/{{ blog.author.head_img }}" style="width:100px;height:100px;"
                 alt="点击头像显示此作者的博客文章列表">
        </a>
    </div>
    <div class="media-body">
        <h3 class="media-heading"><a href="{{ blog.get_absolute_url }}">{{ blog.title }}</a></h3>
        <p>{{ blog.excerpt|safe }}...</p>
        <div class="entry-meta">
            <span class="blog-category"><a href="#">{{ blog.category.name }}</a></span>
            <span class="blog-date"><a href="#"><time class="entry-date"
                                                      datetime="{{ blog.created_time }}">{{ blog.created_time }}</time></a></span>
            <span class="blog-author"><a href="#">{{ blog.author.nikename }}</a></span>
            <span class="comments-link"><a href="#">{{ blog.comment_set.count }} 评论</a></span>
            <span class="views-count"><a href="#">{{ blog.views }} 阅读</a></span>
        </div>
    </div>
    {% empty %}
    <div class="no-post">暂时还没有发布的文章!</div>
    {% endfor %}

    <!-- 简单分页效果
    <div class="pagination-simple">
        <a href="#">上一页</a>
        <span class="current">第 6 页 / 共 11 页</span>
        <a href="#">下一页</a>
    </div>
    -->
    {% if is_paginated %}
    <nav aria-label="Page navigation">
        <ul class="pagination">
            {% if left %}
            <li>
                <a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>
            {% else %}
            <li class="disabled">
                <a href="#" aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>
            {% endif %}
            {% for i in left %}
            <li><a href="?page={{ i }}">{{ i }}</a></li>
            {% endfor %}
            <li class="active"><a href="?page={{ page_obj.number }}">{{ page_obj.number }} <span class="sr-only">(current)</span></a>
            </li>


            {% for i in right %}
            <li><a href="?page={{ i }}">{{ i }}</a></li>
            {% endfor %}
            {% if right %}
            <li>
                <a href="?page={{ page_obj.next_page_number }}" aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>
            {% else %}
            <li class="disabled">
                <a href="#" aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>

            {% endif %}
        </ul>
    </nav>
    {% endif %}
    {% endblock main %}



代码不完整

a标签

报错提示说,让你把这里的代码换一下试试看

re_path('archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/', views.archives, name='archives')

更换为

re_path('archives/(?P[0-9]{4})/(?P[0-9]{1,2})/', views.archives, name='archives')

试一下效果如何

{% archives as date_list %} archives这个变量没看到视图函数里传入啊,另外url配置repath建议这样,尾部加上$,首部加上^,避免歧义,

re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),,

如果引用的base.html,里面需要变量,那所有引用该模板的视图函数都需要传入该变量,我认为主要是模板渲染变量问题