質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7450閲覧

djangoのformとmodelformの違いを教えてほしい

wowow

総合スコア12

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

3クリップ

投稿2018/09/09 09:06

djangoのformとmodelformの使い分けが分かりません。
formは単にユーザーに値を入力させたいときに用い、modelformはそれをmodelのオブジェクトとしてデータベースに格納する際に用いるのでしょうか?
初心者にもわかりやすく教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DjangoのFormは、少々複雑なので、イメージが難しい所ですね(;'∀')

通常のFormでは、Fieldを自ら定義しなければなりませんが、ModelFormは連携するModelをもとにFieldが定義されます。

Formというと、HTMLのFormを再現するものというイメージが強いと思います。
その部分は、あくまでDjangoのForm(ModelForm)の役目の一つです。
テンプレートタグで、いろいろ展開する部分が、これですね。

Djangoでは、サーバーサイド側のバリデーションにもForm(ModelForm)が利用されます。
(汎用ビューを利用すると、そのあたりの仕組みが見えなくてイメージしにくいですが・・・)

サーバーサイドで、バリデーションを行う場合、Postで送られてきたデータをもとに、**Form(ModelForm)インスタンスを再度生成(←イメージしにくい部分です)**します。これを、データが結びつけられたフォーム(bound form)と呼びます。

bound formの場合、Formでは、バリデーションの実行(is_valid()の実行)と、バリデーションが正常に終われば、クリーニングされたデータ(cleaned_data)を取り出せますが、ModelFormでは、それに加えて、Modelに直接save()することができます。

単一のモデルに関するFormを作るのであれば、ModelFormが便利だと思います。

入力された値を、複数のモデルに分けて保存したり、何らかの計算・加工して保存する必要があるのであれば、Formでデータをクリーニングし、そのデータをもとに、それぞれのモデルに書き込む処理を実装するような感じになります。

イメージわきますでしょうか??

投稿2018/09/09 10:45

編集2018/09/09 10:48
Meganezaru

総合スコア715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wowow

2018/09/09 12:04

かなりはっきりしてきました。 現在自分は、モデルに保存されたデータをユーザーが絞り込み検索する機能を実装しようとしているのですが、その際にモデルの持つタグfieldやカテゴリーfieldで絞り込み、ユーザーに返したいと思っています。 この場合だとユーザーからのフォームデータをsaveする必要はないのでFormを使うということになりそうですが、その際にモデルの持つtagやcategoryの中身をフィールドに使ってやるにはどうすればいいのでしょうか?
Meganezaru

2018/09/09 12:34

いろんなアプローチがあると思いますが・・・ Postされた結果(ユーザーが選択したタグ)をもとに、実際のクエリーを実行すればよいのであれば、FormのFieldでタグの値なり、タグに対応したIDなりを取り出せればいいということですよね? モデルに関連付けなくても、ChoicFieldの選択値をモデルから動的に作成するようなイメージで処理できるように思いますが、どうでしょう?
wowow

2018/09/09 12:41

つまりsample_model.objects.all()みたいな手法でChoiceFieldの選択肢を動的に生成すればいいということでしょうか? そんな方法思いつきもしませんでした。勉強になります。
Meganezaru

2018/09/09 12:54

そんなイメージですね。 Formインスタンスを生成するときに、引数として渡して、__init__でchoicesにセットするようなアイデアが、多いようです。
wowow

2018/09/09 13:05

見つけました。こういう方法があったとは。 ありがとうございました。 サンプルコード class SearchForm(forms.Form): author = forms.MultipleChoiceField(label='著者', widget=forms.CheckboxSelectMultiple, required=False) def __init__(self, param): forms.Form.__init__(self, param) self.fields['author'].choices = [(author.id, author.name) for author in Author.objects.all()]
cest-bien

2019/04/25 12:28

この場合だと、ModelChoiceFieldの指定でもよさそうですね。 ただ、タプルの(IDでなく)Valueの方を自由にカスタマイズするなら、Wowowさんのやり方がいろいろ自由にできそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問