【django】フォームを使って投稿する

 

djangoのフォームを使って、名前やメールアドレスを投稿する方法をご紹介します。

 

 

フォームの作成

 

djangoのformsをインポートして、名前、年齢、メールアドレスを定義します。

 

forms.py

from django import forms

class HelloForm(forms.Form):
    name = forms.CharField(label='name')
    mail = forms.CharField(label='mail')
    age = forms.IntegerField(label='age')

 

文字列はCharField、数値はIntegerFieldを使いましょう。

 

ビューの修正

 

リクエストの内容によって、処理を分けるクラスを作ります。

 

views.py

from django.shortcuts import render
from django.views.generic import TemplateView
from .forms import HelloForm


class HelloView(TemplateView):

    def __init__(self):
        self.params = {
            'title': 'Hello',
            'message': 'your data',
            'form': HelloForm()
        }

    def get(self, request):
        return render(request, 'hello/index.html', self.params)

    def post(self, request):
        msg = 'あなたは、<b>' + request.POST['name'] + \
            '(' + request.POST['age'] + ') </b> さんです' + \
            '<br>メールアドレスは<b>' + request.POST['mail'] + '</b>でござろう。'

        self.params['message'] = msg
        self.params['form'] = HelloForm(request.POST)

        return render(request, 'hello/index.html', self.params)

 

TemplateViewクラスを継承することで、関数get,postを定義してその中で処理を分けることができます。

 

post関数の中で、HelloFormをインスタンス化して変数formの上書きをしています。これをすることで、投稿された内容が投稿後も保持されるようになります。

 

テンプレートとURL

 

index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" type="text/css" href="{% static 'hello/css/style.css' %}">
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ message|safe }}</p>
    <table>
    <form action="{% url 'index' %}" method="post">
        {% csrf_token %}
        {{ form.as_table }}
        <tr><td></td><td><input type="submit" value="click"></td></tr>
    </form>
    </table>
</body>
</html>

 

message|safe ですが、これはsafeというフィルタです。message内に含まれるタグをエスケープしないようにします。

csrf_tokenはセキュリティのおまじないと覚えておきましょう。

form.as_tableはビューの中で定義した変数formをテーブル形式で表示するためのものです。

 

urls.py

from django.conf.urls import url
from .views import HelloView


urlpatterns = [
    url(r'', HelloView.as_view(), name='index'),
]

 

実行結果

 

browser

名前とかをいれて、clickすると上の方に太字で表示されます。

 

以上です。皆さんの学習の手助けになれば嬉しいです。

 

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog