【问题标题】:Django - How to pass several arguments to the url template tagDjango - 如何将几个参数传递给 url 模板标签
【发布时间】:2011-01-08 08:01:09
【问题描述】:

在我的 urls.py 中有:

(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/section/(?P<slug>[-\w]+)/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

我正在尝试在模板中执行此操作:

{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}

但我收到此错误:

TemplateSyntaxError
Caught an exception while rendering: Reverse for 'paper_issue_section_detail' with arguments '(2010, 1, 22, u'business')' and keyword arguments '{}' not found.

但是,如果我将 URL 模式更改为只需要一个参数,它就可以正常工作。即:

(r'^(?P<year>\d{4})/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

和:

{% url paper_issue_section_detail issue.pub_date.year %}

因此,当我使用 'url' 模板标签传递多个参数时,它似乎会抱怨 - 我使用两个参数得到相同的错误。有没有不同的方法来传递几个参数?我试过传入命名的关键字参数,这会产生类似的错误。

不管怎样,相关视图的开头是这样的:

def issue_section_detail(request, year, month, day, slug):

如何将多个参数传递给 url 模板标签?

【问题讨论】:

    标签: django django-templates django-urls


    【解决方案1】:

    我遇到了同样的问题(我使用的是 Django 1.3.1)并尝试了 Gregor Müllegger 的建议,但由于两个原因没有奏效:

    • 年月日值之间不应有逗号
    • 我的基于类的通用视图似乎只接受关键字参数

    因此,唯一可行的解​​决方案是:

    {% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}
    

    【讨论】:

      【解决方案2】:

      问题存在于您的 url 配置的 /(?P&lt;month&gt;\d{2})/ 部分。它只允许恰好两位数 (\d{2}),而 issue.pub_date.month 仅允许一位数。

      您可以在 URL 中也允许一位数字(但这将违反唯一 URL 的原则,/2010/1/... 将与 /2010/01/... 相同)或将两位数字传递给您的 url 模板标签中的月份参数。
      您可以使用date 过滤器来实现日期对象的一致格式。像这样使用 url 标签:

      {% url paper_issue_section_detail issue.pub_date|date:"Y",issue.pub_date|date:"m",issue.pub_date|date:"d",section_li.slug %}
      

      查看月份和日期参数:它将始终显示为两位数(必要时带有前导零)。查看documentation of the now tag 以了解date 过滤器可以使用哪些选项。

      【讨论】:

      • 听起来不错 - 我真的不想更改 URL 的可能格式。但是,当我执行 issue.pub_date.month|date:"m" 时,会将一个空字符串传递给 URL/视图。
      • 你是对的 - 对不起。很明显,我在原始帖子中弄错了。我更正了url 标签。您必须使用issue.pub_date|date:"m" 而不是issue.pub_date.month|date:"m"date 过滤器作用于datetime 对象(pub_date 属性)而不是整数(pub_date.month 属性)。
      • Doh,当然,我也应该发现这一点。感谢 Gregor 的帮助。
      【解决方案3】:

      您的月份表达式是(?P&lt;month&gt;\d{2}),但您向它发送了参数11\d{2} 不匹配,因此 url 解析器找不到您的视图。

      尝试将月份表达式更改为\d{1,2}(或类似的东西)。

      【讨论】:

      • 非常感谢您的建议 Seth - 我没有在正则表达式和我试图传递给它的内容之间建立联系。但我不想放松对 URL 的限制,所以我现在根据 Gregor Müllegger 的建议更改我传入的格式。
      猜你喜欢
      • 2021-06-05
      • 2021-02-11
      • 2017-08-11
      • 2013-08-06
      • 2011-06-03
      • 2014-08-06
      • 2016-02-15
      • 2011-08-18
      相关资源
      最近更新 更多