我无法弄清楚如何解决这个问题。
我尝试使用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' %}"><< 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' %}"><< 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
答案 0 :(得分:1)
url(r"^(\d+)/$", 'cal.views.year', name="year"),
这就是我的尝试 要做,但我仍然得到一个错误(在这种关心我的错误是:'str对象 不可赎回)...
好的,用现有视图更改“年份”部分解决了我的问题 问题。谢谢!你能告诉我怎么参考吗? cal.views.month显示月份?应该“月”呈现 观点中的回应?
django中的URL模式有两个必需参数:
第二个参数必须是视图中的现有函数(或类)。该函数可以采用多个参数,并以多种模式显示。
例如,假设您有这样的方法:
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})
您想将其映射到以下网址:
以下是设置方法:
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
中的视图。