Djangoのアーキテクチャ(MTV)モデルのViewで使用されるView関数の使い方についてです。
Djangoの環境構築がまだな方はこちら
Djangoを学びたいならこれです↓↓
Djangoアーキテクチャの理解
まずはDjangoのMTVアーキテクチャを確認しておきましょう。
ルーティングの編集
アーキテクチャを確認したところで例えば以下のようにurls.pyを設定します。
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index)
]
これは「http://127.0.0.1:8000/index」アクセス時にviews.pyにあるindex関数を使用するという意味になります。
View関数の編集
View関数はアプリケーションディレクトリ直下のviews.pyに記載します。
※ここでは触れていませんが、Viewクラス(クラスビュー)も同様にこちらに記入します。
from django.shortcuts import render
def index(request):
context = {'greeting': 'Hello'}
return render(request, 'index.html', context)
~View関数のルール~
・def 内に関数名や処理を記入する
・関数の引数にrequestが必要
・変数は辞書型で設定すること
・render(request, テンプレート, 変数) をレンダリングさせる
この他にも、Viewではデータベースへのデータを取得・登録・更新・削除などを行ったりとプログラムのロジック部分を担う役割があります。
テンプレートの表示
View関数の辞書型の変数は {{ キー名 }} で使用できます。今回であれば {{ greeting }} となります。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テンプレート</title>
</head>
<body>
<h2>View関数</h2>
<p>{{ greeting }}</p>
</body>
</html>
以下のように表示されていればOKです。
View関数でクエリパラメータの取得方法(GETリクエスト)
先ほどのurls.pyを編集します。
from django.urls import path
from . import views
urlpatterns = [
path('index/<int:parameter>', views.index)
]
上記のようにすると、例えば「http://127.0.0.1:8000/index/10」にアクセスした際に入力されたパラメータをurls.pyで受取り、urls.pyで指定したviews.pyの関数にパラメータを渡します。
パラメータを受け取るためには、関数の引数に同名のパラメータ名を指定するだけです。
from django.shortcuts import render
def index(request, parameter):
context = {'greeting': 'Hello',
'parameter': parameter}
return render(request, 'index.html', context)
テンプレートへの表示は辞書型の{{キー名}}を指定すれば良いです。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テンプレート</title>
</head>
<body>
<h2>View関数</h2>
<p>{{ greeting }}</p>
<p>{{ parameter }}</p>
</body>
</html>
「http://127.0.0.1:8000/index/10」にアクセスすると以下のように表示されます。
この方法でクエリパラメータの取得ができます。
View関数でデータの登録を行う(POSTリクエスト)
こちらを確認するためにはフォームを作成し、入力された値がデータベースに登録されることを確認していきます。Djangoでのフォーム作成には一般的なforms.pyを使用して作成していきます。
モデルの作成
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=100)
email = models.EmailField(max_length=240)
マイグレーションファイルの作成
(env) command $ python manage.py makemigrations
マイグレーションの実行
(env) command $ python manage.py migrate
アプリケーションディレクトリ直下にforms.pyを作成
from django import forms
from .models import Person
class PersonForm(forms.ModelForm):
class Meta:
model = Person
fields = '__all__'
フォームを表示させるテンプレートの作成
<form action="{% url 'myApp:form' %}" method="post">
{% csrf_token %}
{{form_display.as_p}}
<input type="submit" id="button" name="button" value="送信">
</form>
{% if name %}
<p>作成者は{{name}}です。</p>
<p>住所は{{address}}です。</p>
<p>メールは{{email}}です。</p>
{% endif %}
・{% url ‘アプリ名 : ルーティングに登録された名前’ %}
・form_displayでモデルに登録されたname , address , email の入力欄が作成されます。
ルーティングの編集
from django.urls import path
from . import views
app_name = 'myApp'
urlpatterns = [
path('index/<int:parameter>', views.index),
path('form/', views.form_post, name='form')
]
・フォーム画面にアクセスするためのルーティングを追記
・name = ‘form’はテンプレートからルーティングへのアクセスを判別しやすくするために設定しておく
View関数の編集
from django.shortcuts import render
from .models import Person
from . import models
from myApp.forms import PersonForm
from . import forms
def form_post(request):
form = PersonForm()
context = {'form': 'Formの練習',
'form_display': form}
if(request.method == 'POST'):
form_check = PersonForm(request.POST)
if form_check.is_valid():
name = request.POST['name']
address = request.POST['address']
email = request.POST['email']
context['name'] = name
context['address'] = address
context['email'] = email
person = Person(name = context["name"], address = context["address"], email = context["email"])
person.save()
return render(request, 'blog/form.html', context)
・form = PersonForm() でフォームのインスタンスを作成し、変数としてフォーム入力欄をフォーム画面に渡しています。
・入力フォーム送信(POSTリクエスト)後、バリデーションで入力された値を確認し、入力された name , address , emailを変数に追加します。
・入力フォーム送信後に同画面上に入力された name , address , emailが表示されます。
・モデル(Person)オブジェクトに入力された name , address , email を格納させ、save()メソッドでデータの追加を行います。
サーバを起動させ、以下のようなフォームに値を入力し「送信」ボタンを押すとDjangoのデフォルトデータベースである「db.sqlite3」にデータが登録されます。
今回は以上です。
オススメのPython講座
コメント