【问题标题】:django NoReverseMatch error for related object when in a loop循环中相关对象的django NoReverseMatch错误
【发布时间】:2013-06-16 16:59:04
【问题描述】:

我的模型:“车间”有一个相关项目,将时间和地点存储在“会话”对象中:

item=models.OneToOneField(Session)

会话将位置存储为位置的外键:

location = models.ForeignKey(conference_models.Location,
        verbose_name=_("location"), blank=True, null=True)

我在模板中展示了一个创意工坊,我想链接到它的位置。如果模板是单个 Workshop 视图,这一切都有效,但如果我传递一个研讨会列表并将其全部包含在:

{% for w in workshops %}

然后坏事发生了......

我在 urls.py 中有这个来定义位置视图的 URL:

url(r'^locations/(?P<location_pk>\d+)/$',
  views.view_location, name='view-location'),

在研讨会模板中我有:

<a href="{% url 'view-location' location_pk=w.item.location.pk %}">
{{w.item.location.pk}} {{w.item.location}}</a> 
- {{w.item.start}} to {{w.item.end}}

我得到Reverse for 'view-location' with arguments '()' and keyword arguments '{'location_pk': ''}' not found.

location_pk 是我的位置视图的参数。一切似乎都是正确的。例如,如果我这样做:

   <a href="{% url 'view-location' location_pk=123546 %}">
    {{w.item.location.pk}} {{w.item.location}}</a> 
    - {{w.item.start}} to {{w.item.end}}

我得到了包含 123546 的预期 URL。如果我这样做:

   <a href="{% url 'view-location' location_pk=w.item.pk %}">
    {{w.item.location.pk}} {{w.item.location}}</a> 
    - {{w.item.start}} to {{w.item.end}}

然后我在 URL 中获得项目主键(这不是我想要的,但证明了我不会因为期待它起作用而发疯......)。

在所有情况下,{{w.item.location.pk}} 标记都会扩展为正确的值。

我已尝试将其包装在 {% with %} 标记中,因此不会出现打点。不开心。

这是 Django 1.4.5,是一个复杂项目的一部分,可能无法处理到 1.5 的更新。如果这需要 1.5 来进行大修复,我将不得不重新考虑......

请注意,这似乎只发生在 {% for %} 循环中...

【问题讨论】:

  • 如果w.item.location.pk 确实返回了一个值,你在 django shell 中看到了吗,因为从错误来看,w.item.location.pk 的评估结果是''
  • 是的,它在 shell 中很好,这就是为什么我也将它放在模板中的 {{w.item.location.pk}} 中。啊...除了一个没有设置位置的工作室!我想你已经明白了。 w.item.location 对于其中之一来说是 None ,并且模板消失了......
  • 已确认。如果您需要代表,请随时写一个答案。

标签: django django-urls


【解决方案1】:

由于location 字段有null=True, blank=True,可能有一些为空的条目,因此w.item.location.pk 正在评估为''

您可以检查{% if w.item.location %},然后加载位置的 URL。

【讨论】:

猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 2015-10-24
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多