Django视图/模板中的DoesNotExist错误与一对一字段

0 投票
2 回答
1237 浏览
提问于 2025-04-17 03:37

我有这些模型。

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而不是抛出错误吗?我是不是漏掉了什么?我觉得这可能和一对一的关系有关,但我在文档中找不到具体的说明。

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

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

2 个回答

0

你提供的信息不够详细,所以很难找到问题的根源。不过,这个简单的错误信息只能由你视图中的一个语句引发,也就是...

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

pak_id可能无效,或者你的模型有问题,导致找不到这个id对应的Storypak。这个调用是唯一会引发DoesNotExist错误的地方。你可以在这一行之前加上raise Exception(str(pak_id)),这样可以查看它试图“获取”的内容,确认一下这个记录在storypak表中是否存在。

0

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

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

你可以看到,这个标签的render方法只捕捉到VariableDoesNotExist这个错误。

撰写回答