Implementing ModelForms in Django for Data Management
ModelForm Overview
ModelForms in Django automatically generaet form fields based on model definitions, inclduing validation rules and field types.
Database Setup
class Publication(models.Model):
title = models.CharField(max_length=64)
cost = models.DecimalField(max_digits=10, decimal_places=2)
publisher = models.ForeignKey('Publisher')
writers = models.ManyToManyField('Writer')
def __str__(self):
return self.title
class Publisher(models.Model):
company = models.CharField(max_length=48)
contact = models.EmailField()
location = models.CharField(max_length=48)
def __str__(self):
return self.company
class Writer(models.Model):
full_name = models.CharField(max_length=48)
gender_options = [
[1, "Male"],
[2, "Female"],
[3, "Other"],
]
sex = models.IntegerField(choices=gender_options, default=1)
details = models.OneToOneField("WriterDetails")
def __str__(self):
return self.full_name
class WriterDetails(models.Model):
address = models.CharField(max_length=48)
mobile = models.CharField(max_length=15)
def __str__(self):
return self.address
ModelForm Implementation
from django.forms import ModelForm
from django import forms
class PublicationForm(ModelForm):
class Meta:
model = Publication
fields = "__all__"
labels = {
"title": "Publication Title",
"cost": "Retail Price",
"publisher": "Publishing Company",
"writers": "Authors"
}
widgets = {
"title": forms.TextInput(attrs={"class": "form-input"}),
"cost": forms.NumberInput(attrs={"class": "form-input"}),
"publisher": forms.Select(attrs={"class": "form-select"}),
"writers": forms.SelectMultiple(attrs={"class": "form-multi"})
}
error_messages = {
"title": {"required": "Title is mandatory"},
"cost": {"required": "Price must be specified"}
}
Editing Existing Records
def modify_publication(request):
pub_id = request.GET.get("pub_id")
publication = Publication.objects.get(id=pub_id)
if request.method == "POST":
form = PublicationForm(request.POST, instance=publication)
if form.is_valid():
form.save()
return redirect("/publications/")
else:
form = PublicationForm(instance=publication)
return render(request, "edit_template.html", {"form": form})
Creating New Records
def add_publication(request):
if request.method == "POST":
form = PublicationForm(request.POST)
if form.is_valid():
form.save()
return redirect("/publications/")
else:
form = PublicationForm()
return render(request, "add_template.html", {"form": form})
HTML Template Example
<div class="form-container">
<form method="post">
{% csrf_token %}
{% for field in form %}
<div class="form-field">
<label>{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<button type="submit">Save</button>
</form>
</div>