ryotankの備考録日記

趣味の電子工作についての備考録などなど

電子工作作業報告書管理アプリその27

viewの解説から

views.pyを開きformの行の後に

form .forms import DataForm

その後に、ビューを追加する

DataFormを新しく作るには、DataForm()を呼び出して、
それをテンプレートに渡す必要がある。

form .forms import DataForm

  def data_new(request):
      form = DataForm()
      return render(request, 'data1.html', {'form':form})

フォームの保存をするには
2つのシチュエーションがある
1つ目は、最初にページにアクセスした時で空白のフォームが必要な場合
2つ目は、すべてのフォームデータが入力された状態でビューに戻ってくる場合

なので条件分岐を追加する必要がある
条件分岐にはif文を使う

if request.method == "POST":
	[.....]
else:
   form = DataForm()

ドット[.....]の部分を埋めていく
methodがPOSTの場合、フォームデータを使ってDataFormを構築する

form = DataForm(request.POST)

次にフォームの値が正しいかどうかチェックする。つまり
すべての必須フィールドが設定され不正な値が送信されない事
これをform.is_valid()で検証する

フォームをチェックして、フォームの値が有効であれば保存が出来る。

if form.is_valid():
    post = form.save(commit=False)
    post.autor = request.user
    post.published_date= timezone.now()
    post.save()

まずform.saveでフォームを保存する事と
autorを追加する事(DataForm内にautorフィールドなく、このフィールドは必須)
commit=Falseは保存前にautorを追加したいのでPOSTモデルを"まだ保存しない"という意味
ほとんどの場合、commit=False無しでform.save()を使うが、
今回は指定する必要がある。
post.save()は変更を保存し(作成者を追加しつつ)データが作成される

新しく作成されたページを表示したい時は次をインポートする

form django.shortcuts import redirect
return redirect('post_detail', pk=post.pk)

post_detailは移動したいviewの名前。このviewでは
pk変数が必須になりviewにそれを渡すためにpk=post.pkを使う
以上を踏まえてviewの全体コードを載せる

def post_new(request):
    if request.method == "POST":
        form = DataForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = DataForm()
    return render(request, 'blog/post_edit.html', {'form': form})

次回はCSSの解説するか