Reputation: 3442
I've got a modelform that I would like to iterate through the form fields in the template but at the same time, when I encounter certain fields, to conditionally render extra html. Currently I am pulling the field name from field.html_name
but I am not sure if that is the best way (it feels hackish somehow, like I should be using a getattr()
filter or something...).
{% for field in form %}
<div class="form-group">
{{ field }}
{% if field.html_name == "location" %}
<!-- CUSTOM HTML HERE -->
{% endif %}
</div>
{% endfor %}
Upvotes: 15
Views: 33471
Reputation: 321
I have the same situation if I don't misunderstand your mean. My solution is field.name
. Code sample:
{% if field.name == 'password' %}
<input type="password" name="password" class="form-control" placeholder="{% trans 'Enter your password' %}">
{% else %}
<input type="email" name="email" class="form-control" placeholder="{% trans 'Enter your email address' %}">
{% endif %}
Upvotes: 25
Reputation: 176
I don't know how you mean, but you can try this
{% for field in form %}
{{ field }}
{% if field.label == 'Location' %}
<h1>Hi</h1>
{% endif %}
{% endfor %}
Whereas, you would have set label in forms.py as
location = forms.CharField(widget=forms.TextInput(
attrs={'class': 'yourclass', 'placeholder': 'Enter your location',
}), label=u'Location', max_length=100, required=True)
Upvotes: 3
Reputation: 1662
Have you considered using a widget or creating your own custom widget? https://docs.djangoproject.com/en/1.10/ref/forms/widgets/
E.g.: for adding just a css class or similiar to the existing input use the attrs
argument
class MyForm(forms.Form):
...
location = forms.CharField(
...,
widget=Input(attrs={'class': 'location', 'style': 'background: red'}),
)
...
Or creating a complete custom widget (take a look at how Input is implemented)
class LocationFieldWidget(Widget):
def render(self, name, value, attrs=None):
return mark_safe('custom html')
and then the form can be rendered in the template simply by
{{ form }}
Upvotes: 2