我有一个表格。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 %}
哪个可以产生预期的结果,但似乎多余,尤其是如果我将来想添加另一个字段属性时。
执行此操作的正确方法是什么?
答案 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属性
请参阅下面的 age 字段,我将使用 self.fields 来获取字段小部件并添加额外的 icon 属性在其 attrs 词典上...要使其正常工作,您应该确保不会在向其他{strong> self.fields 调用之后{@ 1}}出现。 ...如果我没有其他需要在小部件类上进行调整的东西,我会使用它。 https://docs.djangoproject.com/en/2.0/ref/forms/widgets/#styling-widget-instances
请参见下面的名称字段,您可以在Meta类https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#overriding-the-default-fields
表格
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'})
}