Django如何为ModelForm设置自定义属性

时间:2018-07-31 03:48:33

标签: python django

我有一个表格。ModelForm'CreateUserForm'。

我想为每个表单字段设置一个属性,以便以后在模板中使用。

在这种情况下,我想设置一个图标名称,以指定每个字段应使用的图标名称。

class CreateUserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    icon_names = ['person', 'email', 'enhanced_encryption']

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

我在遍历该字段及其属性'icon_names'时遇到麻烦。我不能zip()才能真正失去功能。

目前,我已经通过使用'forloop.parentloop.counter'一起破解了迭代

    {% for field in form %}
    <div class="form-group">
        <div class="input-field">
            <i class="icons">
                {% for icon in form.icon_names %}
                    {% if forloop.parentloop.counter == forloop.counter %}
                        {{ icon }}
                    {% endif %}
                {% endfor %}
            </i>
            <input type="text" id="autocomplete-input" class="autocomplete">
            <label class="control-label" for="autocomplete-input">{{ field.label_tag }}</label>
        </div>
    </div>
{% endfor %}

哪个可以产生预期的结果,但似乎多余,尤其是如果我将来想添加另一个字段属性时。

执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

一个想法是在上下文中传递zip ped列表,例如:

context = {'fields_with_icons': zip(form.icon_names, [field for field in form])}

然后

{% for field, icon in fields %}
{{ field }}
{{ icon }}
{% endfor %}

答案 1 :(得分:0)

我可以通过两种方法来完成这两项工作,都涉及在字段小部件上添加额外的html属性

  1. 请参阅下面的 age 字段,我将使用 self.fields 来获取字段小部件并添加额外的 icon 属性在其 attrs 词典上...要使其正常工作,您应该确保不会在向其他{strong> self.fields 调用之后{@ 1}}出现。 ...如果我没有其他需要在小部件类上进行调整的东西,我会使用它。 https://docs.djangoproject.com/en/2.0/ref/forms/widgets/#styling-widget-instances

  2. 请参见下面的名称字段,您可以在Meta类https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#overriding-the-default-fields

  3. 上执行此操作

表格

super().__init__(*args, **kwargs)

在模板上遍历字段ID时,像这样

class PersonForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['age'].widget.attrs['icon'] = 'age'

    class Meta:
        model = models.Person
        fields = ('name', 'age')
        widgets = {
            'name': forms.TextInput(attrs={'icon': 'email'})
        }