【问题标题】:DoesNotExist error in django view/template with one-to-one field具有一对一字段的django视图/模板中的DoesNotExist错误
【发布时间】:2011-10-04 04:04:55
【问题描述】:

我有这些模型。

class Storypak(models.Model):
    headline = models.CharField('Headline', max_length=200)
    pub_date = models.DateField(blank=True)

class Story(models.Model):
    storypak = models.OneToOneField('Storypak', blank=True, null=True)
    copy = models.TextField(blank=True)

还有这个观点。

def pak_detail(request, pak_id, year, month, day):
    pak = Storypak.objects.get(pk=pak_id)
    t = loader.get_template('storypak_detail.html')
    c = Context ({
        'pak' : pak,
        })
    return HttpResponse(t.render(c))

当我尝试在模板中使用 if 语句时,会引发 DoesNotExist 错误。我可以找到的文档表明应该消除这些错误。 if pak.story 不应该解决 False 并且不抛出错误吗?我错过了什么?我认为这可能与 OneToOne 关系有关,但我在专门处理此问题的文档中找不到任何内容。

这是我记得的相关模板代码。我在这台电脑上没有文件。如果它不正确,我稍后会修复它,如果有帮助,我可能会发布调试信息。

{% if pak.story %}
    <p>{{ pak.story.copy }}</p>
{% endif %}

【问题讨论】:

  • 请至少显示模板导致错误的部分
  • 使用模板 sn-p 更新

标签: python django django-models django-templates django-views


【解决方案1】:

这里有一个相关的错误:https://code.djangoproject.com/ticket/10227

这里是if 标签的来源:https://code.djangoproject.com/browser/django/trunk/django/template/defaulttags.py#L267

如您所见,标签的 render 方法除了 VariableDoesNotExist 之外什么都捕捉不到。

【讨论】:

  • 我不太明白 gsakkis 的解释,但我应该能够实施解决方案。谢谢。
  • 只需在您的视图中检查 pak.story,您将能够在其中捕获异常,而不是在模板中。
【解决方案2】:

您没有提供足够的详细信息来解决这里的错误,但是简单的错误消息只能由您视图中的一个语句触发,即...

pak = Storypak.objects.get(pk=pak_id)

pak_id 无效,或者您的模型格式不正确且具有该 ID 的 Storypak 不存在。这是对会引发 DoesNotExist 错误的对象的唯一调用。您可以通过在此行之前添加raise Exception(str(pak_id)) 来验证它是一个有效的 id,以查看它试图“获取”什么。验证 storypak 表中是否存在记录。

【讨论】:

  • 包装很好。我能够显示其他属性,如标题等。当 pak 有相关的“故事”项目时,它呈现得很好。当没有故事项目时,会引发 DoesNotExist 异常。这让我感到困惑,因为我认为这些异常在默认情况下被静音了。我想创建一个根据 pak 的内容呈现不同的模板。也许这是错误的方法。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2014-05-20
  • 2011-05-28
  • 2021-02-23
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多