NoReverseMatch错误 - 简单的日历应用程序

时间:2014-06-22 09:56:07

标签: python django url views

我无法弄清楚如何解决这个问题。

我尝试使用lightbird教程制作一个简单的日历。我得到的是以下错误:

Reverse for 'cal.views.main' with arguments '(2011,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['$']

这就是发生此错误的原因:

<a href="{% url "cal.views.main" year|add:'-3' %}">&lt;&lt; Prev</a>

我的cal / views.py文件包含:

def main(request, year=None):
    ...
    return render_to_response("cal/main.html", dict(years=lst, user=request.user, year=year,))

我的main.html文件包含:

{% extends "cal/base.html" %}
{% load url from future %}
<!-- ... -->
{% block title %} Cal {% endblock %}
{% block content %}

<a href="{% url "cal.views.main" year|add:'-3' %}">&lt;&lt; Prev</a>
{% endblock %}

我的ulrs.py文件包含:

url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'cal.views.main', name="main"),

最后,由我的项目文件组成的整个树看起来像这样(我列出了最重要的文件):

website
 - cal
 - - models.py
 - - views.py
 - website
 - - static
 - - templates
 - - - cal
 - - - - base.html
 - - - - main.html
 - - urls.py

1 个答案:

答案 0 :(得分:1)

  

url(r"^(\d+)/$", 'cal.views.year', name="year"),这就是我的尝试   要做,但我仍然得到一个错误(在这种关心我的错误是:'str对象   不可赎回)

     

...

     

好的,用现有视图更改“年份”部分解决了我的问题   问题。谢谢!你能告诉我怎么参考吗?   cal.views.month显示月份?应该“月”呈现   观点中的回应?

django中的URL模式有两个必需参数:

  1. 要匹配的模式。
  2. 匹配模式时调用的函数。
  3. 第二个参数必须是视图中的现有函数(或类)。该函数可以采用多个参数,并以多种模式显示。

    例如,假设您有这样的方法:

    def display_events(request, year=None, month=None, day=None):
        # do something to filter events
        events = Event.objects.all()
        if year:
           events.filter(event_date__year=year)
        if month:
           events.filter(event_date__month=month)
        if day:
           events.filter(event_date__day=day)
    
        return render(request, 'events_list.html', {'events': events})
    

    您想将其映射到以下网址:

    • /事件/ 2014
    • /事件/ 2014/06
    • /事件/ 2014/6月5日

    以下是设置方法:

    url(r'^events/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})$',
       'cal.vews.display_events', name='daily'),
    
    url(r'^events/(?P<year>\d{4})/(?P<month>\d{2})$',
       'cal.views.display_events', name='monthly'),
    
    url(r'^events/(?P<year>\d{4})$',
       'cal.views.display_events', name='yearly'),
    
    url(r'^events/$', 'cal.views.display_events', name='all-events'),
    

    复杂的部分是正则表达式,short intro is provided in the documentation

    • r'(这是一个Python原始字符串,这意味着一切都是字面意思,不解释特殊字符。)
    • ^ - 字符串开头
    • events/ - 文字字符串 events /
    • ( - 开始捕获组。这意味着,引擎将捕获(返回)与结束)之前匹配表达式的所有内容。
    • ?P<year> - 这意味着“群组中捕获的内容,将其命名为”年份“。                这些被称为命名捕获组。                有关详情,请参阅Python documentation
    • \d - 数字
    • {4} - 前一个模式中的四个
    • ) - 关闭捕获组
    • $ - 字符串结尾
    • ' - 结束原始字符串

    上述冗长的详细版本是:

    搜索网址。如果您看到events/后跟恰好有四个数字,请捕获这四个数字并将其作为名称year作为参数发送给名为display_events的视图方法,该方法将位于{ {1}}模块的{1}}模块。

    django中的应用程序只是Python模块。

    由于模式是按照匹配的第一顺序应用的,因此您应该放置最“自由”模式最后,这样如果没有其他匹配,它将匹配。

    所有这些模式都指向相同的视图方法。只是根据URL中匹配的内容,将传递不同的参数。

    最后,请记住,网址格式无法匹配查询字符串(网址中views之后的部分)。此信息始终传递到类似dict的对象cal中的视图。

相关问题