【问题标题】:Referencing a dynamic number of fields in a template in django在 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 模板语言中引用这些表单域?

【问题讨论】:

    标签: django templates forms dynamic


    【解决方案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 Meyerthis 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 %}
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2010-12-16
      • 2012-07-17
      • 2015-08-16
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多