I am trying to write a Bootstrap Form with Django ModelForm. I have read the Django Documentation Django Documentation about Forms, so I have this code:
<div class="form-group"> {{ form.subject.errors }} <label for="{{ form.subject.id_for_label }}">Email subject:</label> {{ form.subject }}</div>
The {{form.subject}} is rendered by Django, for example in CharField field model, as input tag,
<input type="text"....> etc.
I need add "form-control" class to every input in order to get Bootstrap input appearance (without third-party packages). I found this solution Django add class to form <input ..> field. Is there any way to add a class to every field by default without specifying it in every attribute of the class of Form class?
class ExampleForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'})) email = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'})) address = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'})) country = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
and so on ..
Django Model Form It is a class which is used to create an HTML form by using the Model. It is an efficient way to create a form without writing HTML code. Django automatically does it for us to reduce the application development time.
The differences are that ModelForm gets its field definition from a specified model class, and also has methods that deal with saving of the underlying model to the database. Show activity on this post. Show activity on this post. Form is a common form that is unrelated to your database (model ).
If you can't use a third-party app and want to add a class (e.g., "form-control") to every field in a form in a DRY manner, you can do so in the form class __init__()
method like so:
class ExampleForm(forms.Form): # Your declared form fields here ... def __init__(self, *args, **kwargs): super(ExampleForm, self).__init__(*args, **kwargs) for visible in self.visible_fields(): visible.field.widget.attrs['class'] = 'form-control'
You might need to handle checking for existing classes in attrs too, if for some reason you'll be adding classes both declaratively and within __init__()
. The above code doesn't account for that case.
Worth mentioning:
You specified that you don't want to use third-party packages. However, I'll take one second to mention that one of the simplest ways of automatically making forms render in the style of Bootstrap is to use django-crispy-forms, like this:
# settings.py CRISPY_TEMPLATE_PACK = 'bootstrap3' # forms.py from crispy_forms.helper import FormHelper class ExampleForm(forms.Form): # Your declared form fields here ... helper = FormHelper() # In your template, this renders the form Bootstrap-style: {% load crispy_forms_tags %} {% crispy form %}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With