0

我在 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)

日、月、年和 company_uuid 是可选参数。所以,我可以导航到

  • /事件
  • /事件/13062013
  • /事件/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.

我该如何解决?

4

1 回答 1

2

试试这个:

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 -> month -> day而不是day -> month -> 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' %}
    • 还有很多
于 2013-06-13T08:31:44.987 回答