- 1. Use Form Mixin to include field(s) in various forms
- 2. Various Form field example
- 3. Override field and form clean method
- 4. Override form init method
- 5. Override labels, widgets in Meta class
- 6. Add choices in form init method
- 7. Create field in form init
- 8. Pass custom argument when creating form instance and use that in instance
from django import forms
class AuthorFormMixin(forms.Form):
author_name = forms.CharField(
label='Author Name',
help_text='Specify Author Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Author Name Here'
})
)
class BookForm(AuthorFormMixin, forms.Form):
book_name = forms.CharField(
label='Book Name',
help_text='Specify Book Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
})
)
class NoteForm(AuthorFormMixin, forms.Form):
note_text = forms.CharField(
label='Note Text',
help_text='Specify Note Text here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Note Text Here'
})
)
Uses bootstrap(v4) and select2 for frontend styling.
from django import forms
from .models import Author, Genre
class AllDjangoFieldForm(forms.Form):
STATUS_CHOICES = (
('unconfirmed', 'Unconfirmed'),
('pending', 'Pending'),
('accepted', 'Accepted'),
('rejected', 'Rejected'),
)
genre = forms.ModelChoiceField(
queryset=Genre.objects.all(),
empty_label='All',
label='Genre',
widget=forms.Select(attrs={
'class': 'select2_elements',
'placeholder': 'Select Genre',
'style': 'width : 100%'
}
)
)
author = forms.ModelMultipleChoiceField(
queryset=Author.objects.all(),
label='Author',
widget=forms.SelectMultiple(attrs={
'class': 'select2_elements',
'placeholder': 'Select Author',
'style': 'width : 100%',
'multiple': 'multiple'
}
),
)
status = forms.ChoiceField(
choices=STATUS_CHOICES,
widget=forms.Select(attrs={
'class': 'select2_elements',
'placeholder': 'Select Status',
'style': 'width : 100%'
}),
)
action_date = forms.DateTimeField(
label='Select Action Date',
input_formats=['%d %b %Y %H:%M'],
help_text='Date on which action is taken',
widget=forms.DateInput(attrs={
'class': 'form-control',
'placeholder': 'Action Date'
}
),
)
book_name = forms.CharField(
label='Book Name',
help_text='Specify Book Name here',
required=False,
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
})
)
description = forms.CharField(
label='Description',
help_text='Specify Description here',
widget=forms.Textarea(attrs={
'class': 'form-control',
'placeholder': 'Description here',
'rows': '4'
})
)
is_published = forms.BooleanField(
label='Is Book Published',
required=False,
)
book_id = forms.CharField(
widget=forms.HiddenInput()
)
from django import forms
class ContactForm(forms.Form):
phone_number = forms.CharField(
label='Phone Number',
help_text='Specify Phone Number here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Phone Number Here'
})
)
name = forms.CharField(
label='Name',
help_text='Specify Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Name Here'
})
)
email = forms.EmailField(
label='Name',
help_text='Specify Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Name Here'
})
)
def clean_phone_number(self):
phone_number = self.cleaned_data.get('phone_number')
if phone_number and len(phone_number) != 10:
self.add_error('phone_number', 'Phone Number should be of 10 digits')
# dont forget to return the value
return phone_number
def clean(self):
cleaned_data = super(ContactForm, self).clean()
name = cleaned_data.get('name')
email = cleaned_data.get('email')
if name and not email:
raise forms.ValidationError('Email is required when name is entered')
return cleaned_data
from django import forms
class BookForm(forms.Form):
genre = forms.ModelChoiceField(
queryset=Genre.objects.all(),
empty_label='All',
label='Genre',
widget=forms.Select(attrs={
'class': 'select2_elements',
'placeholder': 'Select Genre',
'style': 'width : 100%'
}
)
)
name = forms.CharField(
label='Book Name',
help_text='Specify Book Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
})
)
def __init__(self, *args, **kwargs):
super(BookForm, self).__init__(*args, **kwargs)
self.fields['genre'].queryset = Genre.objects.filter(is_enabled=True)
from django.forms import ModelForm
from .models import Book
class BookForm(ModelForm):
class Meta:
model = Book
fields = ('name', )
labels = {
'name': 'Book Name',
}
widgets = {
'name': forms.TextInput(
attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
}
)
}
from django import forms
class BookForm(forms.Form):
book_name = forms.CharField(
label='Book Name',
help_text='Specify Book Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
})
)
genre = forms.ChoiceField(
label='Genre',
help_text='Specify Genre here',
choices=(),
widget=forms.Select(attrs={
'class': 'select2_elements',
'placeholder': 'Select Genre',
'style': 'width : 100%'
})
)
def __init__(self, *args, **kwargs):
super(BookForm, self).__init__(*args, **kwargs)
choices = [('', '')] + [(genre.name, genre.name) for genre in Genre.objects.all()]
self.fields['genre'].choices = choices
from django import forms
class BookForm(forms.Form):
def __init__(self, *args, **kwargs):
super(BookForm, self).__init__(*args, **kwargs)
self.fields['book_name'] = forms.CharField(
label='Book Name',
help_text='Specify Book Name here',
widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Enter Book Name Here'
})
)
from django import forms
class BookForm(forms.Form):
genre = forms.ChoiceField(
label='Genre',
help_text='Specify Genre here',
choices=(),
widget=forms.Select(attrs={
'class': 'select2_elements',
'placeholder': 'Select Genre',
'style': 'width : 100%'
})
)
def __init__(self, *args, **kwargs):
genre_category = kwargs.pop('genre_category', None)
if genre_category:
queryset = Genre.objects.filter(category__in=genre_category)
else:
queryset = Genre.objects.all()
choices = [('', '')] + [(genre.name, genre.name) for genre in queryset]
super(BookForm, self).__init__(*args, **kwargs)
self.fields['genre'].choices = choices
# in views, when creating form instance, pass `genre_category`
form_obj = BookForm(request.GET or None, genre_category=my_custom_genre_category)