Slide 1

Slide 1 text

Django Forms

Slide 2

Slide 2 text

Django Forms • Forms? • Forms! • Model forms

Slide 3

Slide 3 text

Web Page

Slide 4

Slide 4 text

Web Page with Form submit

Slide 5

Slide 5 text

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

• Where to send • URL • Default: "" (current URL)

Slide 8

Slide 8 text

• How to send • Either get or post • Get: postcard • Post: Enveloped • Default: get

Slide 9

Slide 9 text

• How to read • application/x-www-form-urlencoded • Default • multipart/form-data • Form contains file

Slide 10

Slide 10 text

GET Submission Query string

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Slide 13

Slide 13 text

Submit

Slide 14

Slide 14 text

Submit

Slide 15

Slide 15 text

Slide 16

Slide 16 text

Django Forms!

Slide 17

Slide 17 text

Models Database Django forms HTML forms

Slide 18

Slide 18 text

from django import forms class MessageForm(forms.Form): name = forms.CharField( max_length=100, ) title = forms.CharField( max_length=100, required=False, ) content = forms.CharField( widget=forms.Textarea, )

Slide 19

Slide 19 text

from .forms import MessageForm def message_board(request): form = MessageForm() return render( request, 'message_board.html', {'form': form}, )

Slide 20

Slide 20 text

{% csrf_token %} {{ form.as_p }} ૹग़

Slide 21

Slide 21 text

{% csrf_token %} {{ form.as_p }} ૹग़ ?

Slide 22

Slide 22 text

CSRF Token • Cross Site Request Forgery protection • “Recognise” whether a form is legit • Protect the server from malicious changes

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

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, )

Slide 26

Slide 26 text

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, )

Slide 27

Slide 27 text

class MessageForm(forms.Form): # ... def save(self): data = self.cleaned_data message = Message( name=data['name'], title=data['title'], content=data['content'], ) message.save() return message

Slide 28

Slide 28 text

class MessageForm(forms.Form): # ... def save(self): data = self.cleaned_data message = Message( name=data['name'], title=data['title'], content=data['content'], ) message.save() return message

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Further Reading • Model forms • Form factories • Custom “cleaning”

Slide 31

Slide 31 text

Exercises • Implement message form • Implement message model, save POST-ed form to it • Get messages from database • Display messages in template

Slide 32

Slide 32 text

Hint {% for m in messages %}

{{ m.name }}

{{ m.title }}
{{ m.content|linebreaks }}
{% endfor %} Message.obejcts.order_by('-created_at')