【问题标题】:Django TemplateSyntaxErrors in generic date based Class views基于通用日期的类视图中的 Django TemplateSyntaxErrors
【发布时间】:2013-04-02 18:52:01
【问题描述】:

我正在尝试更新旧的 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 开始出现:

无法解析某些字符:year|,month||date:"b"

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

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

我确实注意到 {{ year }} 被呈现为 'Jan. 1, 2013' 而不是 '2013' 匹配 url 中的正则表达式。这个我不明白。

然后我尝试渲染以下内容:

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

不高兴,这次 TemplateSyntaxError 是:

无法解析余数:',"apr"' from '"2013","apr"'

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

【问题讨论】:

  • "{% url coltrane_entry_archive_month year,month|date:"b" %}" 应该是'{% url coltrane_entry_archive_month year month|date:"b" %}'
  • karthikr - 谢谢。我已经接受了下面的答案,但在这里感谢您的 cmets 和解决方案。

标签: django


【解决方案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 开始,它 根据通常的规则进行评估:它可以是带引号的字符串 或将在上下文中查找的变量。

【讨论】:

  • 嘿,这不是我第一次被逗号难住了...感谢您的回答,这确实有效。一个有争议的问题,但我必须将 {{ year }} 更改为 {{ month|date:"Y" }} 以适应 url 模式 - 否则我会收到 NoReverseMatch 错误。我不知道为什么它不像以前那样渲染。
  • 刚刚注意到您发布到模板标签中内置 url 的链接 - 太好了,我没能在帮助中找到它。
  • 如果输出为Jan. 1, 2013,它看起来像是作为日期传递的,因此使用日期过滤器应该没问题。至于为什么会这样,我也不知道……
  • 是的,我也在模板循环之外使用了 {{year}} 变量,并且刚刚尝试了日期过滤器,效果很好。
猜你喜欢
  • 2012-06-09
  • 2011-08-06
  • 2010-10-14
  • 2011-07-29
  • 1970-01-01
  • 2012-01-28
  • 2011-11-14
  • 2013-06-21
  • 2016-08-06
相关资源
最近更新 更多