Skip to content
Advertisement

Django forms: not adding attributes

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'})
      }

Advertisement

Answer

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'})
      }
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement