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

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

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

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

Python

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

Q&A

1回答

4059閲覧

djangoのget_context_data()について

matsuo_basho

総合スコア88

Django

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

Python

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

0グッド

0クリップ

投稿2020/08/17 07:57

素朴な疑問なのですが、以下のようにget_context_data()内のcontextをself.contextとして
クラス内で使い回すのって良いでしょうか?

class IndexView( TemplateView ): template_name = "books/index.html" def get_context_data( self, **kwargs ): self.context = super().get_context_data( **kwargs ) form = PublisherCreateForm( self.request.POST or None ) self.context['form'] = form self.context['formset'] = BookCreateFormFormset() return self.context def post( self, form ): form = PublisherCreateForm( self.request.POST or None ) if form.is_valid(): publisher = form.save( commit = False ) bookformset = BookCreateFormFormset( self.request.POST, instance = publisher ) if bookformset.is_valid(): publisher.save() bookformset.save() return redirect( 'books:index' ) else: self.context['formset'] = bookformset

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

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

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

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

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

dameo

2020/08/19 04:18

良くないと思いますよ。 ■Viewがリクエスト単位で破棄されるものであった場合 同じリクエスト内であればself内に何かを保存し、参照することに問題はありません。ただし、別メソッドが参照するタイミングがあるなら、それは別スレッドとかになるのではないかと思います。同一スレッドなら素直に引数や戻り値で渡せばいいので... ■Viewがリクエスト単位で破棄されるものでなかった場合 複数のリクエストで1つのコンテキストを参照することになってしまいます。 例えば、ユーザーAとユーザーBが別セッションからどちらかのコンテキストを参照することになってしまうでしょうね。 仮にリクエストがスレッドで処理される場合は、セッションでなかったとしても、2つのリクエストが処理するコンテキストが同じになってしまい、困ると思います。 ちゃんと調べてないので曖昧な話になってすみません。
dameo

2020/08/19 04:50

https://docs.djangoproject.com/en/dev/ref/class-based-views/#specification "Each request served by a class-based view has an independent state; therefore, it is safe to store state variables on the instance (i.e., self.foo = 3 is a thread-safe operation)." だそうなので、上記「Viewがリクエスト単位で破棄されるものであった場合」に近そうで、問題はなさそうです。利便性などの都合で同一スレッドでも属性に保管したりするのかもしれません。
matsuo_basho

2020/08/22 02:14

色々とお調べいただき本当にありがとうございました。 self.context = super().get_context_data( **kwargs ) のようにself を付けなかった場合ですが、 dameo様であればどのように post() 内でhtml側に formset を返しますか...? ( いま記述している self.context['formset'] = bookformset の箇所をself,cintext を用いずに表現する場合はdameo様であればどのようになるのかなと...)
dameo

2020/08/22 02:45

djangoはまともに使ったことがないので、今までセッションを使った実装が必要なかったのですよ。 ただリクエストにまたがるデータならセッションを使います。 それで駄目ならデータをページに埋め込んでhiddenでもいいからまた送ってもらいます。 セッションは少し実装してみないと分からないので、お返事は気が向いたときになっちゃいます。
dameo

2020/08/22 03:23

よく考えたら前回リクエストにまたがってるわけではなさそうだという調査結果でしたね。 セッションは必要ないかも・・・ ただこのソース何をしてるのかよく分かりません。BookCreateFormFormsetとは何ですか? postの引数formとは何が違うんでしょう? なんでrequest.POSTを入れてるんですか? invalidだった場合、self経由で作り直したbookformsetを入れてない場合どうなるんでしょう? 必要性がよく分かりません。私が知らないだけかもですけど。
guest

回答1

0

良いと思いますが...
何か予期しない動作がありましたか?

投稿2020/08/17 09:54

編集2020/08/17 09:54
ForestSeo

総合スコア2720

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

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

matsuo_basho

2020/08/22 02:16

回答ありがとうございます。 いえ、特に現状不具合等はないのですが、 いろんなサイトや公式ドキュメントを調べながら実装をしているのですが、 このような記述をしているサンプルが全然なく自信がありませんでした...。
ForestSeo

2020/08/22 02:46

たしかにTemplateViewだったら、get関数でrenderする方が多いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問