在 django 的模板中引用动态数量的字段

Posted

技术标签:

【中文标题】在 django 的模板中引用动态数量的字段【英文标题】:Referencing a dynamic number of fields in a template in django 【发布时间】:2011-06-03 23:51:08 【问题描述】:

这一切都很简单。我有这个表格:

class add_basketForm(forms.Form):
def __init__(self, selected_subunits, *args, **kwargs):


    self.selected_subunits = selected_subunits
    super(add_basketForm, self).__init__(*args, **kwargs)

    for subunit in self.selected_subunits:
        self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField()

子单元的数量未知。我想用这样的东西(你明白了):

% for unit in selected_subunits %
   form.su%s  % (unit.unit__id)
% endfor %

但这当然行不通。我的问题是如何在 Django 模板语言中引用这些表单域?

【问题讨论】:

【参考方案1】:

为了访问动态字段实例的 BoundField 实例,这使您可以访问 all of the attributes and methods necessary to render the field,您需要使用 form.fieldname 而不是 form.fields[fieldname] 的形式访问字段对象

这是对表单类的潜在重构:

class add_basketForm(forms.Form):
    def __init__(self, selected_subunits, *args, **kwargs):
        super(add_basketForm, self).__init__(*args, **kwargs)
        for subunit in self.selected_subunits:
            self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField()

    def su_fields(self):
        for name in self.fields:
            if name.startswith('su'):
                yield(self[name])

然后在您的模板中,您应该能够通过访问form.su_fields 来迭代您通常期望的字段:

% for su_field in form.su_fields %
....
% endfor %

(我已经为同样的问题苦苦挣扎了几个小时。感谢this answer from Carl Meyer 和this article on dynamic form generation from Jacob Kaplan-Moss 为我指明了正确的方向。)

【讨论】:

非常感谢您!我已经在一个个人爱好项目上苦苦挣扎了一个月,因为我无法让我的表格正常工作。我感到非常沮丧,因为我觉得这应该只是工作,但不能完全正确地得到咒语。你对我帮助很大。【参考方案2】:

将这些字段分组到一个附加列表中,然后简单地遍历这个列表。

__init__:

self.subunit_list = []
for subunit in self.selected_subunits:
        field = forms.IntegerField()
        self.fields['su%d' % (subunit['unit__id'])] = field
        self.subunit_list.append(field)

在模板中:

% for field in form.subunit_list %
  ...
% endfor %

【讨论】:

+1:最好的解决方案是不要把它放在模板中,因为它不是模板逻辑。 我在 for 循环中写什么来显示输入字段?在我看来,我仍然有在循环中引用每个“未知”字段名的问题,例如这个 field.su%s % (unit.unit__id) 如果我只写 field 我得到这个作为输出: 我想我的答案一定是使用表单集,也许吧。 KillianDS:那你会怎么做?我对 Django 很陌生,所以我不像你那么精通模板逻辑。【参考方案3】:

为了纠正 gruszczy 的回答,这段代码对我有用:

__init__ 的表单中:

self.subunit_list = []
for subunit in self.selected_subunits:
        field = forms.IntegerField()
        self.fields['su%d' % (subunit['unit__id'])] = field
        self.subunit_list.append(self['su%d' % (subunit['unit__id'])])

在您的模板中:

% for field in form.subunit_list %
  <!-- show form field (inputbox) -->
   field 
% endfor %

【讨论】:

以上是关于在 django 的模板中引用动态数量的字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django,如何在模板中动态设置 ModelForm 字段值?

如何在渲染django模板时动态设置表单选择字段的初始值

django:自相关 ForeignKey 字段的相关名称不起作用 |在模板中获取相反方向的自引用

Django 使用模板标签拆分文本字段

django模板变量从查询集中构建表的字段数

具有动态数据的 django 模板表单目标