LoginSignup
3
4

More than 3 years have passed since last update.

[Django / python] form.Form を使ったフォームからの値をまとめて代入したいですよね?

Last updated at Posted at 2021-04-18

概要

画面(templates)からviews.pyに渡した値を1つずつ代入するのが嫌になりました。
そこで試行錯誤してみたら、そこそこらくちんになったので共有(^ワ^*)

どういうこと?

こういうことです!

# root_directory/app_name/views.py

def new_book(request):
    """本の新規登録"""
    form = BookForm(request.POST or None)
    if form.is_valid():
        book = Book()
        book.title = form.cleaned_data['title']
        book.author = form.cleaned_data['author']
        book.publisher = form.cleaned_data['publisher']
        # もう嫌になった!!!!
        # なんで1個ずつ代入せなあかんのじゃ!!
        # パラメータが10も20もあったらどうすんじゃい!!!

解決策

手抜きもーど_(-ω-`_)⌒)_

ソースコード

# root_directory/app_name/views.py

def new_book(request):
    """本の新規登録"""
    form = BookForm(request.POST or None)
    if form.is_valid():
        # 1行でまとめて代入!!きもちいい!!!
        book = Book(**form.cleaned_data)

これでいけました。
周知の事実なのかもしれませんが、記事が見つからなかったので...どなたかの参考になれば幸いです。

補足

ちなみにこの**は、辞書型データの中身を展開して、

  • keyを引数名として
  • valueを値として

メソッドに渡すときに使うものです。

# もし以下のようなデータになっていたとすると...
# form.cleaned_data => { 'name': 'name_aaa', 'author': 'ryukishi007' }

# こう書いた場合、
Book(**form.cleaned_data)

# こう書いているのと同じ動作になります。
Book(name='name_aaa', author='ryukishi007')

(知ってたけど初めて役に立った。)

3
4
2

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
3
4