0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Django】ModelFormにてあらかじめ入力値を与える方法

Posted at

##ModelFormとは
ModelFormとはdjango.forms.Modelformで呼び出すことができるあらかじめ用意されているインスタンス。このインスタンスを継承したFormクラスを作成することで、Models.pyに定義したテーブルをそのままに参照できる。つまり、ユーザーからのフォーム入力によってデータベースへの登録や更新を行いたいときに用いられる。

##今回のテクニックはどこで使うのか?
例えば「タイトル、現在時刻、作成者」をフィールドに持つデータモデルについて、ユーザからのフォーム入力を実装するとき、わざわざ現在時刻と作成者をユーザにうたせる作業はUXを下げてしまう。そういった、ユーザにわざわざうってもらう必要のない情報や自動的に情報を与えたいときなどにフォームに初期値を与えて、該当するフィールドを非表示(Hidden)にしてしまう方法によって実現できる。

##まずテンプレート上での非表示の設定の仕方

forms.py
from django import forms
from .models import Event


class EventCreateForm(forms.ModelForm):

    class Meta:
        model = Event
        fields = ('eventtitle','eventdate','location','agenda','author')
        widgets={'author':forms.HiddenInput()
        }

ModelFormを知らない方へ軽く説明しておくと、基本的にMetaクラス内で様々な条件をうっていきます。model変数にはmodels.pyのEventクラスをインスタンス化させて指定します。fields変数にはリスト型でフォームにいれるフィールドを指定します。

widgets変数はフィールドのhtmlでのinput表示を変更したり、エラーメッセージの指定など様々なオプションを指定できます。

今回まずこのwidgets内にてauthorフィールドをHiddenInputにして非表示にしています。

##views.pyでのフォーム情報の追加

views.py
from django.contrib.auth.models import User
from .forms import EventCreateForm

def createeventfunc(request):
    if request.method == 'POST':
        form =EventCreateForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('遷移先')
        return render(request,'createevent.html',{'form':form})
    #Getメソッドの時、下を実行
    #default_dataにてauthorフィールドへの値をセット
    else:
        default_data = {'author':User.objects.get(pk=request.user.pk)}
        form = EventCreateForm(default_data)
        return render(request,'createevent.html',{'form':form})

formオブジェクトを作る際にデフォルトの値を引数をして与えられます。
上の例ではまずGetメソッドでurlおよびcreateeventfunc()が呼び出された場合、author:ログイン中のユーザのid(pk)をデフォルトのデータとしてformオブジェクトを生成。そしてそのformオブジェクトをレンダーしています。
form内でsubmitが押されたとき(POST送信とします)、上のif文が実行されます。form.save()とするだけでデータベースへの登録が完了します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?