【问题标题】:Reverse url with multiple optional params具有多个可选参数的反向 url
【发布时间】:2013-06-09 12:24:40
【问题描述】:

我在 URLconf 中有以下 URL:

url(r'^events(/((?P<day>\d{2})(?P<month>\d{2})(?P<year>\d{4}))?/(?P<company_uuid>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})?)?$',
    'events',
    name='events'),

和views.py:

@login_required
def events(request, day=None, month=None, year=None, company_uuid=None):
    today = now()
    if company_uuid:
        return HttpResponse(company_uuid)

day、month、year 和 company_uuid 是可选参数。 所以,我可以导航到

  • /事件
  • /events/13062013
  • /events/13062013/28b68080-d336-11e2-b53f-001e681fda9d

但是在模板的某个地方,我想使用反向 url 并建立链接,例如:

<a class="btn" href="{% url 'events' company_uuid=company.uuid %}">Show all company events</a>

显示所有公司活动而不指定日期。

我得到的只是错误:

NoReverseMatch at /companies
Reverse for 'events' with arguments '()' and keyword arguments '{u'company_uuid': u'28b68080-d336-11e2-b53f-001e681fda9d'}' not found.

我该如何解决?

【问题讨论】:

  • 由于您的网址并非旨在处理类似于 events/companyuid/ 的网址,因为它也依赖于日期,因此 /13062013/ 部分。重新设计您的 URL 模式将使其工作。

标签: django django-templates django-urls


【解决方案1】:

试试这个:

url(
    r'^events/(?:(?P<year>\d{4})/)?(?:(?P<month>\d{2})/)?(?:(?P<day>\d{2})/)?(?:(?P<company_uuid>[a-f0-9\-]{36})/)?$',
    'events',
    name='events'),

我做了以下更改。

  • 简化了company_uuid 模式,您可以根据需要切换回您的模式
  • 当您有日、月、年时,您应该更好地显示 URL,例如 events/2013/12/01/ 而不是 events/20131201/
  • 将层次结构更改为year -&gt; month -&gt; day 而不是day -&gt; month -&gt; year
  • 以下模式将匹配:

    • events/{year}/
    • events/{year}/{month}/
    • events/{year}/{month}/{day}/
    • events/{year}/{month}/{day}/{company_uuid}/
    • 还有更多
  • 现在你可以在模板中做

    • 对于此 URL,通常您也应该始终使用命名组
    • {% url 'events' year=2013 %}
    • {% url 'events' year=2013 month=6 %}
    • {% url 'events' year=2013 month=6 day=13 %}
    • {% url 'events' year=2013 month=6 day=13 company_uuid='28b68080-d336-11e2-b53f-001e681fda9d' %}
    • {% url 'events' company_uuid='28b68080-d336-11e2-b53f-001e681fda9d' %}
    • 还有更多

【讨论】:

  • 在您的示例中,月份和年份包含斜线。示例:events/2013/06/14 day is 14(正确)月份是 06/(不正确)年份是 2013/(不正确)
猜你喜欢
  • 2014-02-16
  • 2014-12-24
  • 2016-02-28
  • 2019-03-11
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多