djangoのmodelsの基本動作 マイグレーションから表示まで実装②

前回からの続きになります。今回は便利なクラスフォームを使用してみます。

ゴールはこんな感じ

環境

・django2.2

・python3.8

まずはformsを使ってデータを送信できるようにする

新たにforms.pyを作成します。

my_friend/forms.py

from django import forms # Formクラスはforms.Formのクラスを継承して作成する 
class HelloForm(forms.Form):
    name = forms.CharField(label='name')
    mail = forms.CharField(label='mail') 
    age = forms.IntegerField(label='age')

my_friend/urls.py

パスも作成

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

app_name = 'my_friend'

urlpatterns = [
    # path('', views.index, name='index'),
    # path('', views.form, name='form'),
    url(r'', HelloView.as_view(), name='index'),
]

my_friend/views.py

viewsの作成

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


class HelloView(TemplateView):
    
    def __init__(self):
        self.context = {
            'title': 'Hello',
            'message': 'your data:',
            'form': HelloForm()
        }
    def get(self, request):
        return render(request,'my_friend/index.html', self.context)

    def post(self, request):
        # msg = 'あなたは <b>' + request.POST['name'] + '(' + request.POST['age'] +  \
        # ') </b>さんです。<br>メールアドレスは <b>' + request.POST['mail'] + \
        # '</b> ですね。'
        msg = 'OK'
        self.context['message'] = msg
        self.context['form'] = HelloForm(request.POST)
        return render(request, 'my_friend/index.html', self.context)

def index(request):
    # get時
    if request != 'POST':
        context = {
            'title': '友達のデータ',
            'message': 'お名前は?',
            'form': HelloForm(),
        }
        if request.method == 'POST':
            context['message'] = '名前:' + request.POST['name'] + \
            '<br>メール:' + request.POST['mail'] + \
            '<br>年齢:' + request.POST['age']
            context['form'] = HelloForm(request.POST)
        return render(request, 'my_friend/index.html', context)

    return render(request, 'my_friend/index.html', context)

def form():
    msg = request.POST['msg']
    context = {
        'title': 'Hello/Form',
        'message': 'こんにちは' + 'msg' + 'さん',
    }
    return render(request, 'my_friend/index.html', context)

my_friend/templates/my_friend/index.html

indexを修正します。

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>{{title}}</title>
  <link rel="stylesheet" href="{% static 'my_friend/css/style.css' %}" />
</head>
<body>
    <h1>{{title}}</h1>
    <p>{{message|safe}}</p>
    <table>
      <form action="" method="post"> 
        {% csrf_token %}
        {{ form.as_table }}
        <tr><td><input type='submit' value="click"></td></tr>
      </form>
     </table>  
</body>
</html>

使ってみる

こちらに適当に数値を入れてclickします

うまく反映されました。値の扱いをできるようにしただけなので、DBには保存はされていません。

ちなみに値が空欄のままclickを押すと、このようにエラーが出現します。

以上、formsとmodelsの簡単な使い方ということで書きました。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です