今回は関数。 つまりpythonですと
def(): フォームを作りたいよ~~~。
という形でフォームを作る方法を書こうと思います。 下の記事でclassを使った方法はすでに記載しました。 https://qiita.com/sr2460/items/a22770f357d8a24403ab
models.py、forms.py、htmlの書き方は上の記事を見てもらうとして、classですとこんな風に書いてフォームを作成していました。
class クラス名(CreateView): model = Post form_class = PostForm template_name = "使用したいテンプレート名" success_url = "リダイレクトするURL"
これを関数で書くと、
from django.shortcuts import render, redirect def form(request): form = PostForm(request.POST or None) if request.method == 'POST' and form.is_valid(): form.save() return redirect(アプリケーション名:リダイレクトしたいurlのname) context = { 'form' :form } return render(request, 'アプリケーション名'/テンプレート名.html', context)
切り取ってみていきましょう。
POSTでurlにアクセスされた場合(フォームは送信された場合)PostFormにrequest(入力内容)が送信されるよ。 POSTじゃない場合はNone(フォーム内は空でhtmlに出力されるよ)というニュアンスです。(なんかうまく説明できない)
form = PostForm(request.POST or None)
もしrequestがPostならバリデーションをして(想定されていない型で送信された場合弾いてくれます)、form.save()で入力内容が保存されます。
if request.method == 'POST' and form.is_valid(): form.save()
フォームを送信した後に飛ぶurlの設定。
return redirect(アプリケーション名:リダイレクトしたいurlのname)
フォームを使用するhtmlをrenderで指定してcontectリストを使ってformの情報をhtmlで使えるようにします。
context = { 'form' :form } return render(request, 'アプリケーション名'/テンプレート名.html', context)
これで関数部分の話は終わり!
クラスの場合urls.pyは
path('使いたいURL', views.クラス名.asview(),name='使いたい名前'),
ですが関数の場合は
path('使いたいURL', views.関数名,name='使いたい名前'),
という風に書きます。views.クラス名.asview()とviews.関数名という違いがありますね。 今回はこれで終わり。