你能用其他变量访问 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>&#10003;  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 模板语言中的变量属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中访问子模板中的会话变量?

我刚学C语言 怎么样让一个变量到其他的文件也能用?

Django:访问子模板中的循环变量

Django之模板语言-----Filter

如何使用Django模板在javascript中访问ajax jquery中的模板变量

使用 Google App Engine(Webapp)访问 Django 模板中的会话变量 - Python