Introduction to Django Forms for Django Girls × Taipei.py workshop.
Django Forms
View Slide
Django Forms• Forms?• Forms!• Model forms
Web Page
Web Page with Formsubmit
method="POST"enctype="multipart/form-data">
method="post"enctype="multipart/form-data">• Where to send• URL• Default: "" (current URL)
method="post"enctype="multipart/form-data">• How to send• Either get or post• Get: postcard• Post: Enveloped• Default: get
method="post"enctype="multipart/form-data">• How to read• application/x-www-form-urlencoded• Default• multipart/form-data• Form contains file
GET SubmissionQuery string
POST Submission"GET /admin/ HTTP/1.1" 302 0"GET /admin/login/?next=/admin/ HTTP/1.1" 200 1679"POST /admin/login/?next=/admin/ HTTP/1.1" 302 0"GET /admin/ HTTP/1.1" 200 3407
Submit
Django Forms!
ModelsDatabaseDjango formsHTML forms
from django import formsclass MessageForm(forms.Form):name = forms.CharField(max_length=100,)title = forms.CharField(max_length=100, required=False,)content = forms.CharField(widget=forms.Textarea,)
from .forms import MessageFormdef message_board(request):form = MessageForm()return render(request, 'message_board.html',{'form': form},)
{% csrf_token %}{{ form.as_p }}ૹग़
{% csrf_token %}{{ form.as_p }}ૹग़?
CSRF Token• Cross Site Request Forgeryprotection• “Recognise” whether a form is legit• Protect the server from maliciouschanges
class Message(models.Model):name = models.CharField(max_length=100,)title = models.CharField(max_length=100, blank=True,)content = models.TextField()created_at = models.DateTimeField(auto_now_add=True,)
class MessageForm(forms.Form):# ...def save(self):data = self.cleaned_datamessage = Message(name=data['name'],title=data['title'],content=data['content'],)message.save()return message
def message_board(request):if request.method == 'POST':form = MessageForm(request.POST)if form.is_valid():form.save()else:form = MessageForm()return render(request, 'message_board.html',{'form': form},)
Further Reading• Model forms• Form factories• Custom “cleaning”
Exercises• Implement message form• Implement message model,save POST-ed form to it• Get messages from database• Display messages in template
Hint{% for m in messages %}{{ m.name }}{{ m.title }}{{ m.content|linebreaks }}{% endfor %}Message.obejcts.order_by('-created_at')