Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Django Forms

Django Forms

Introduction to Django Forms for Django Girls × Taipei.py workshop.

Tzu-ping Chung

February 23, 2016
Tweet

More Decks by Tzu-ping Chung

Other Decks in Programming

Transcript

  1. Django Forms

    View Slide

  2. Django Forms
    • Forms?
    • Forms!
    • Model forms

    View Slide

  3. Web Page

    View Slide

  4. Web Page with Form
    submit

    View Slide

  5. method="POST"
    enctype="multipart/form-data">



    View Slide

  6. View Slide

  7. method="post"
    enctype="multipart/form-data">
    • Where to send
    • URL
    • Default: "" (current URL)

    View Slide

  8. method="post"
    enctype="multipart/form-data">
    • How to send
    • Either get or post
    • Get: postcard
    • Post: Enveloped
    • Default: get

    View Slide

  9. method="post"
    enctype="multipart/form-data">
    • How to read
    • application/x-www-form-urlencoded
    • Default
    • multipart/form-data
    • Form contains file

    View Slide

  10. GET Submission
    Query string

    View Slide

  11. 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

    View Slide

  12. method="POST"
    enctype="multipart/form-data">



    View Slide



  13. Submit

    View Slide



  14. Submit

    View Slide

  15. method="POST"
    enctype="multipart/form-data">



    View Slide

  16. Django Forms!

    View Slide

  17. Models
    Database
    Django forms
    HTML forms

    View Slide

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

    View Slide

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

    View Slide


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

    View Slide


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

    ?

    View Slide

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

    View Slide

  23. View Slide

  24. View Slide

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

    View Slide

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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. Hint
    {% for m in messages %}

    {{ m.name }}
    {{ m.title }}
    {{ m.content|linebreaks }}

    {% endfor %}
    Message.obejcts.order_by('-created_at')

    View Slide