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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

4004閲覧

<python,Django>ListViewとCreateViewを1つのページに表示する際のcontext_dataの意味と必要性について

sr2460

総合スコア49

Django

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/01/23 05:45

ListViewとCreateを1つのページに表示するようにこのようなコードを書きました。

python

1#views.py 2 3class PostandBoard(generic.CreateView): 4 model = Post 5 form_class = PostForm 6 template_name = 'board/board.html' 7 success_url = reverse_lazy('board:index') 8 9 10class IndexView(generic.ListView): 11 model = Post 12 13 14 15class FormAndListView(PostandBoard, IndexView,): 16 def get(self, request, *args, **kwargs): 17 formView = PostandBoard.get(self, request, *args, **kwargs) 18 listView = IndexView.get(self, request, *args, **kwargs) 19 formData = formView.context_data['form'] 20 listData = listView.context_data['object_list'] 21 context = {'form' : formData, 'post_list' : listData} 22 return render(request, 'board/test.html', context)

html

1#test.html 2 3<form action="" method="POST"> 4{{ form.as_p }} 5<button type="submit">送信</button> 6{% csrf_token %} 7</form> 8 9 10{% for post in post_list %} 11 12<p>{{ post.name }}</p> 13<p>{{ post.text | linebreaksbr }}</p> 14<p>{{ post.date }}</p> 15 16{% endfor %} 17 18

これでCreateViewとListViewを1つのページで表示できたのですが、

formData = formView.context_data['form'] listData = listView.context_data['object_list']

の['form']と['object_list']の役割がよくわかりません。
context_dataはformViewやListViewのデータを渡しているのでしょうが、'form'と'object_list'に関してはテンプレートなどでも使っていないのですが、消すと送信ボタン以外はすべての表示が消えてしまいます。
なので現状このまま書いてはいるのですが、なぜこれを消すと表示が消えてしまうのか理解はし切れていないのです。
もしよければご教示いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

'form'と'object_list'に関してはテンプレートなどでも使っていないのですが、消すと送信ボタン以外はすべての表示が消えてしまいます。

formobject_list も テンプレートで使ってるように見えますね。

formData = formView.context_data['form'] listData = listView.context_data['object_list'] context = {'form' : formData, 'post_list' : listData} return render(request, 'board/test.html', context)

こう書いた場合 test.html テンプレートには form という名前で formData が、 post_list という名前で listData (つまり object_list) が渡されます。

<form action="" method="POST"> {{ form.as_p }} # <= ここでformを使ってる <button type="submit">送信</button> {% csrf_token %} </form> {% for post in post_list %} # <= ここで post_list(=object_list) を使ってる <p>{{ post.name }}</p> <p>{{ post.text | linebreaksbr }}</p> <p>{{ post.date }}</p> {% endfor %}

上記 テンプレには form.as_pfor post in post_list というのが、使ってる箇所です。

特に form.as_p は "フォームの内容をHTMLタグで書き出す" 役目を担っているので、消してしまうと、遭遇されたように、送信ボタンしかないような見た目になると思います。

投稿2019/01/23 06:25

tell_k

総合スコア2120

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

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

sr2460

2019/01/23 07:23 編集

>>こう書いた場合 test.html テンプレートには form という名前で formData が、 post_list という名前で >>listData (つまり object_list) が渡されます。 という部分から自分でも調べてみました!おそらくmodels.pyのフィールドをobject_listというデフォルトの名前で書き出せる(言い方が変なような気がしますが)という部分が私の中で勉強が足りていなかったんだと思います。 素早い回答感謝いたします!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問