Python Django如何设置ModelForm的自定义属性

Python Django如何设置ModelForm的自定义属性,python,django,Python,Django,我有一个forms.ModelForm“CreateUserForm” 我想为每个表单字段设置一个属性,以便以后在模板中使用 在这种情况下,我想设置一个图标名来指定每个字段应该使用哪个图标名 class CreateUserForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) icon_names = ['person', 'email', 'enhanced_encryptio

我有一个forms.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\u names”时遇到问题。我真的不能不失去功能

目前,我已经使用“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 %}
{%用于表单%]中的字段
{%用于表单中的图标。图标\名称%}
{%if-forloop.parentloop.counter==forloop.counter%}
{{icon}}
{%endif%}
{%endfor%}
{{field.label_tag}
{%endfor%}
这会产生预期的结果,但似乎是多余的,特别是如果我想在将来添加另一个字段属性


正确的方法是什么?

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

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

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

有两种方法可以做到这一点,都涉及在fields小部件上添加额外的html属性

  • 请参阅下面的age字段,我将使用self.fields获取字段小部件,并在其attrs字典上添加额外的图标属性……要使其起作用,您应确保它在调用
    super()之后出现
    othersself.fields将不会被填充……当我没有任何其他需要在widget类上调整的内容时,我会使用此选项。

  • 请参见下面的name字段,您可以在Meta类上执行此操作

  • 形式

    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'})
            }
    
    在模板上,当在字段上循环时,我得到如下结果

    {% for field in form %}
       {{ field.field.widget.attrs.icon }}
    {% endfor %}