基于通用日期的类视图中的Django TemplateSyntaxErrors

时间:2013-04-10 18:58:45

标签: django

我正在尝试更新旧的Django项目(最后在Django 1.4上工作)以使用基于类的通用视图(在Django 1.5中)

以下用于工作

模板:

{% block content %}
    {% for month in date_list %}
        <h2><a href="{% url coltrane_entry_archive_month year,month|date:"b" %}">{{ month|date:"F" }}</a></h2>
        <h2>Blah</h2>
    {% endfor %}
{% endblock %}

urls.py

urlpatterns = patterns('django.views.generic.date_based',
...   
    (r'^(?P<year>\d{4})/$', 'archive_year', dict(entry_info_dict,make_object_list=True), 'coltrane_entry_archive_year'),
    (r'^(?P<year>\d{4})/(?P<month>\w{3})/$', 'archive_month', entry_info_dict, 'coltrane_entry_archive_month'),
...
)

然而,当我更新urls.py以使用泛型类

class ArticleYearArchiveView(YearArchiveView):
    queryset = Entry.objects.all()
    date_field = "pub_date"
    make_object_list = True
    allow_future = True

urlpatterns = patterns('',
...
    url(
        r'^(?P<year>\d{4})/$',
        ArticleYearArchiveView.as_view(),
        name='coltrane_entry_archive_year'
    ),
    url(
        r'^(?P<year>\d{4})/(?P<month>\w{3})/$',
        dates.MonthArchiveView.as_view(
            template_name='coltrane/entry_archive_month.html',
            queryset=Entry.objects.filter(status=Entry.LIVE_STATUS),
            date_field='pub_date'),
        name="coltrane_entry_archive_month"
    ),
...
)

以下TemplateSyntaxError开始出现:

无法解析某些字符:年|,月||日期:“b”

我可以使用以下内容渲染模板并检查传递给coltrane_entry_archive_month的内容:

{% for month in date_list %}
    {{ year }}
    {{ month|date:"b" }}
{% endfor %}

我注意到{{year}}正在呈现为'Jan. 1,2013'而不是'2013'与网址中的正则表达式相匹配。我不明白。

我接下来尝试渲染以下内容:

{% for month in date_list %}
    {% url "coltrane_entry_archive_month" "2013","apr" %}
{% endfor %}

没有快乐,这次TemplateSyntaxError是:

无法解析余数:','apr''来自'“2013”​​,“apr”'

在Django中,泛型类视图和url似乎都是较大的主题,所以任何指针都会非常受欢迎!

1 个答案:

答案 0 :(得分:1)

url标记不使用以逗号分隔的参数,只是用空格列出它们。

{% for month in date_list %}
    {% url "coltrane_entry_archive_month" "2013" "apr" %}
{% endfor %}

表示您需要将实际模板更改为

{% url "coltrane_entry_archive_month" year month|date:"b" %}

也只是一个注释(我注意到你在第二个例子中跟着)

  

不要忘记在函数路径或模式名称周围加上引号!

     

在Django 1.5中更改:第一个参数用于不引用,   这与其他模板标签不一致。自Django 1.5以来,它   根据通常的规则进行评估:它可以是带引号的字符串   或者将在上下文中查找的变量。