在 Django 模板中使用外键作为变量

Posted

技术标签:

【中文标题】在 Django 模板中使用外键作为变量【英文标题】:Use foreign key as variable in Django template 【发布时间】:2016-04-05 07:13:50 【问题描述】:

我是 Django 和 Python 的新手(甚至是编程新手),现在正在创建我的第一个应用程序。我有一个包含外键的模型,它是多对一的关系(一行可以包含许多文章,但每篇文章只与一行相关)。在我的模板中,我想连接多个值来为图像源创建一个 url。

models.py中的相关信息:

class Article(models.Model):
  line = models.ForeignKey(Line, null=True)
  article = models.CharField(max_length=128)
  slug = models.SlugField(null=True)

class Line(models.Model):
  line = models.CharField(max_length=128, unique=True)

相关视图将Article.objects.get(slug=article_slug) 作为article in context_dict 发送到模板。在我的模板中,我包含以下内容并正确返回预期值: article.article article.line 。如果我连接 article.article 的值,它会返回预期值:

% with article.article as a %

这里 a 显示了article.article 的值。但是,当我尝试连接 article.line 的值时,我没有得到任何值。

% with article.line as l %

l 不返回任何内容。我认为这是因为外键也可以解释为一对多,因此我尝试指定哪个值(我还使用了诸如 article.line.all.0 之类的变体)。

% with article.line_set|first as l %

这里 l 也不返回任何内容。

为什么我可以在模板中将article.line 的值作为文本返回,但我不能将它包含在串联中?

【问题讨论】:

【参考方案1】:

article.line_set 不是打印相关Line 对象的正确方法,因为它们之间没有这种关系。

至于问题,很有可能是 article.lineNone,我认为 Django 模板引擎在尝试访问为空的 article.line 实例的 .line 属性时会默默地抑制可能的 Models.DoesNotExist 异常。

确保article.line 不是None,以便您可以按如下方式打印出它的文本表示:

% with article.line.line as l %

【讨论】:

谢谢:article.line.line 是解决方案!至于数据库设计,我不确定您的建议是否正确:在我的数据库中,我可以有文章 A 属于 X 行,文章 B 也属于 X 行,A 和 B 不能属于任何其他行。继续,文章 K、L 和 M 可以属于 Y 行,但不能属于任何其他行。

以上是关于在 Django 模板中使用外键作为变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将用户定义的设置作为变量包含在 Django 模板中?

将 DJango 模板变量作为输入参数传递

Django 使用模板变量的值作为另一个变量名的一部分

Python:如何在我的 Django 模板中传递外键的值?

Django 在模板标签中使用变量

在 django 模板中显示外键值