The Admin Interface & Forms
The admin interface is heavily customizable.
Let's take a look at some examples...
Django's Form
class can help us with all these things.
A form consists of a series of fields/inputs. What do we need to know about these fields to make a form?
Django's Form
class let's us specify all these things (and more).
from django import forms
class MyForm(forms.Form):
name = forms.CharField(label="Your name",
max_length=200)
age = forms.IntegerField(label="Your age",
min_value=1,
max_value=150,
required=True)
shirt_size = forms.ChoiceField(choices=(("S", "small"),
("M", "medium"),
("L", "large"),
("XL", "x-large")))
double_order = forms.BooleanField(label="Double order?")
<form action="/some-url/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Save">
</form>
<form action="/url/" method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="KrsfY">
<label for="id_name">Your name:</label>
<input type="text" name="name" maxlength="200" required id="id_name">
<label for="id_age">Your age:</label>
<input type="number" name="age" min="1" max="150" required id="id_age">
<label for="id_shirt_size">Shirt size:</label>
<select name="shirt_size" id="id_shirt_size">
<option value="S">small</option>
<option value="M">medium</option>
<option value="L">large</option>
<option value="XL">extra large</option>
</select>
<label for="id_double_order">Double your order?</label>
<input type="checkbox" name="double_order" required id="id_double_order">
<input type="submit" value="Save">
</form>
Now what happens when we hit "save"?
request
object
>>> request.POST)
{'age': ['29'],
'csrfmiddlewaretoken': ['TXFKW5m4vOsJjg0LXOrP3hNsiXI8XrOa'],
'double_order': ['on'],
'name': ['Ruth Smith'],
'shirt_size': ['M']}
form = MyForm(request.POST)
Because the form object generated the HTML <form>
, it knows how to handle
the contents of the form when the user submits it.
Validating the data is an important step:
def form_view(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
# Handle valid form here
pass
else:
form = MyForm()
return render(request, "form.html", {"form": form})
Calling form.is_valid()
will check that the contents of the form are what we expect.
If the contents are not valid, we can send that form
back to the template to be rendered...
You can also customize validation on a per-field basis:
from django.core.exceptions import ValidationError
def is_named_bob(value):
if "Bob" not in value:
raise ValidationError(
"Only people named Bob may apply!"
)
class MyForm(forms.Form):
name = forms.CharField(label="Your name",
max_length=200,
validators=[is_named_bob])
age = forms.IntegerField(label="Your age")
Sometimes fields may depend on each other for validation:
class MyForm(forms.Form):
name = forms.CharField(label="Your name",
max_length=200,
required=True)
age = forms.IntegerField(label="Your age",
required=True)
def clean(self):
cleaned_data = super().clean()
if cleaned_data["name"] == "Bob" \
and cleaned_data["age"] <= 30:
raise ValidationError(
"If you name is Bob, you must be over 30"
)
The validity of the form here depends on how age and name relate.
You can specify a custom widget:
class MyForm(forms.Form):
name = forms.CharField(label="Your name",
max_length=200)
age = forms.IntegerField(label="Your age",
min_value=1,
max_value=150,
required=True)
shirt_size = forms.ChoiceField(choices=(("S", "small"),
("M", "medium"),
("L", "large"),
("XL", "xlarge")),
widget=forms.RadioSelect)
double_order = forms.BooleanField(label="Double order?")
A widget is Django’s representation of an HTML input element.
Calendar:
Rich Text:
Map:
ModelForm
from django.db import models
from django.forms import ModelForm
class MyModel(models.Model):
name = models.CharField("Your Name", primary_key=True)
age = models.IntegerField("Your age", blank=False)
shirt_size = models.CharField(max_length=6,
choices=(("S", "small"),
("M", "medium"),
("L", "large")))
double_order = models.BooleanField("Double order?")
class MyModelForm(ModelForm):
class Meta:
model = MyModel
save()
method. This method creates and saves a database object from the data bound to the form.