Django forms: not adding attributes

Question:

I’m aware that there is many post like this, but can you spot the typo or error in my code?

I’m adding custom classes to my forms but when I inspect the element on the web page there are none. The same goes for placeholder.

Code:

Views.py:

def render_main(request):
    form = AuthorForm()
    context = {
        'form' : form 
    }
    return render(request,'nglib/search.html', context)

Template file:

 {% csrf_token %}
 <div class="col-6">
   {{form.name}}
 </div>
 <div class="col-6">
  {{form.surname}}
</div>

Forms.py:

from django.core.exceptions import ValidationError
from django.forms import ModelForm
from .models import SearchStats
from django import forms
import re


def isStandardized(value):
    if not re.compile(r'^[a-zA-Z ]+$').match(value):
        raise ValidationError('Enter only english characters')
    return True
        
class AuthorForm(ModelForm):

    name = forms.CharField(validators=[isStandardized])
    surname = forms.CharField(validators=[isStandardized])

    class Meta:
      model   = SearchStats
      fields  = ['name', 'surname', 'author_id', 'amount']

      widgets = {
          'name': forms.TextInput(attrs={'class':'form-control',  'placeholder':'Name of an author'}),
          'surname': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Surname of an author'}),
          'author_id': forms.TextInput(attrs={'type':'hidden'}),
          'amount': forms.TextInput(attrs={'type':'hidden'})
      }

Asked By: rafaelHTML

||

Answers:

I think, you already specified the fields name and surname in the class itself, so you should use inline widgets not Meta widgets, as they are used for overriding default widgets, so:


class AuthorForm(ModelForm):

    name = forms.CharField(validators=[isStandardized],widget=forms.TextInput(attrs={'class':'form-control','placeholder':'Name of an author'}))
    surname = forms.CharField(validators=[isStandardized],widget=forms.TextInput(attrs={'class':'form-control','placeholder':'surname of an author' }))

    class Meta:
      model   = SearchStats
      fields  = ['name', 'surname', 'author_id', 'amount']

      widgets = {
          'author_id': forms.TextInput(attrs={'type':'hidden'}),
          'amount': forms.TextInput(attrs={'type':'hidden'})
      }
Answered By: Sunderam Dubey