如何克服NoReverseMatch在模板中if语句中的链接?

时间:2017-12-28 15:59:06

标签: django django-templates

如果它们存在为链接我想要一些价值。 在某些情况下,值将为None,在某些情况下,它将具有用户应该能够单击的记录。

所以在我的模板中,我把它放在if语句

{% if expense_row.noteextra.extra.id  %} <a href="{% url
'extra_notes_details' pk=expense_row.noteextra.extra.id %}" class="btn
btn-info">{{ expense_row.noteextra}}</a> 
                  {% else %}
                   {{ expense_row.noteextra}}

                 {% endif %}

但是尽管if语句我仍然会收到错误

  

NoReverseMatch at / expense / list / range /

Reverse for 'extra_notes_details' with arguments '()' and keyword arguments '{u'pk': ''}' not found. 1 pattern(s) tried: ['unit/extra_notes_details/(?P<pk>\\d+)$']

这意味着Django模板正在为早期阶段的URL进行解析 并不关心那些非操作的url是否在if语句中,甚至是注释掉的-it只会转储错误。

如何在不收到错误的情况下构建偶尔的链接?

2 个答案:

答案 0 :(得分:1)

尝试将方法添加到模型中:

def unit_url(self):
    unit_id = getattr(self.noteunit.unit, 'id', None)
    if unit_id:
        return reverse('extra_notes_details', kwargs={'pk': unit_id})

并在模板中使用它:

{% if expense_row.unit_url %}
    {{ expense_row.unit_url }}
{% else %}
    {{ expense_row.noteunit}}
{% endif %}

答案 1 :(得分:1)

{% url %}标记可让您将结果分配给变量。如果无法撤消URL,将不会引发错误。

{% url 'extra_notes_details' pk=expense_row.noteextra.extra.id as the_url %}"

{% if the_url %}
  <a href="{{ the_url }}" class="btn btn-info">{{ expense_row.noteextra}}</a>
{% else %}
  {{ expense_row.noteextra}}
{% endif %}