你能用其他变量访问 django 模板语言中的变量属性吗?
Posted
技术标签:
【中文标题】你能用其他变量访问 django 模板语言中的变量属性吗?【英文标题】:Can you access variable attributes in the django template language with other variables? 【发布时间】:2022-01-07 09:34:19 【问题描述】:假设我有两个变量 - User 和 Fruitlist。 User 是一个模型实例,而fruitlist 是一个列表。
% for user in users %
<tr>
<td> user.title </td>
<td> user.text </td>
% for fruit in fruitlist %
<td> user.fruit </td>
% endfor %
% endfor %
我正在尝试使用上面的代码创建一个表,其中为 fruitlist 中的每个水果创建一个列,并且该列填充了属性 user.fruit 的值(用户模型为每个水果都有一个字段其中包含一个值)。
为什么上面的代码不起作用?
编辑:
以下原始问题的解决方案 - 以下是关于表格的
对于表格:
% for fruit in fruits %
% if user|get_attr:fruit != True %
form|get_attr:fruit
% else %
<p>✓ fruit </p>
% endif %
% endfor %
【问题讨论】:
什么是user.fruit?是字符串还是外键? 一个整数字段。所以如果列表中的第一个水果是“香蕉”,它应该返回 user.banana 的值 【参考方案1】:您的代码不起作用,因为水果属性被解释为字符串。
您可以编写自定义过滤器来检索模板中作为变量的属性。
# your_app_name/templatetags/your_app_name_tags.py
from django import template
register = template.Library()
@register.filter
def get_attr(obj, attr):
return getattr(obj, attr)
然后在你的模板中
% load your_app_name_tags %
% for user in users %
<tr>
<td> user.title </td>
<td> user.text </td>
% for fruit in fruitlist %
<td> user|get_attr:fruit </td>
% endfor %
% endfor %
【讨论】:
这适用于加载模型对象属性 - 但是当我尝试将其用于 modelform 时,我收到错误消息“对象没有属性”,即使它确实如此。我需要自定义表单过滤器吗? @LarsLill,要获取模型属性,您需要访问模型实例。使用 form.instance 语法访问模型表单的模型实例。例如。 form.instance.user 澄清一下 - 我想要呈现表单小部件。也许我犯了一个错误,但添加 .instance 只是给了我价值。 @LarsLill,我认为我们需要查看您的模板和表单,以获得您想要实现的目标。您可以使用 form.field 呈现表单字段并使用 form.instance.attribute 访问模型数据。 好的,现在添加。代码给了我一个属性错误,它告诉我我正在使用的表单没有被调用的属性(即“香蕉”) - 但表单确实有该字段并且如果我手动执行它,调用它就可以工作。 【参考方案2】:替换:
<td> user.fruit </td>
与:
<td> user[fruit] </td>
幸运的是,您可以在这里访问一个属性,就像它是一个字典键一样。
尽管根据您的描述,这可能不是正确的解决方案。
如果水果列表是这样的:
fruitlist = ['apple', 'orange', 'banana']
那么它应该是一个适用的解决方案
【讨论】:
List 确实看起来像那样 - 但不幸的是,当我尝试这个时,我遇到了一个解析错误。以上是关于你能用其他变量访问 django 模板语言中的变量属性吗?的主要内容,如果未能解决你的问题,请参考以下文章