cowbert
cowbert

Reputation: 3442

how to access django form field name in template

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

Answers (3)

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

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

zsepi
zsepi

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

Related Questions