djangoチュートリアル その3、その4
その3は正直言うことない。
ただurls.pyにnamespacceを追加して逆引きでURLを指定するときに'namespace: name'ってコロンで区切るのを忘れることが多いのでモジュールのインポートと同じように . で区切ればよかったんじゃないだろうか。
その4
汎用ビューが難しい。
def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question}) class DetailView(generic.DetailView): model = Question template_name = 'polls/detail.html'
detail関数とDetailView.as_view()は同じ働きをする。クラスビューはデフォルトの動作が細かく設定されていて、それを上書きすることで使う感じ。DetailViewが指定してないのに{'question':question}って変数を使ってテンプレートをレンダリングできるのはそれがデフォルトの動作だから。これを変えるにはcontext_object_name='hoge'と上書きすればいい。
GETとPOSTで動作を変えることもできる。
class MyView(View): def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
って書けば
if request.method == 'GET' .....
とやっていたのを省略できる。
1ページで複数のオブジェクトの内容を表示したい(例えば作家一覧と、その作家が書いた小説一覧など)のに汎用ビューじゃ1つしかmodelを設定できないじゃないかと思った人もいるかもしれない。そんなときはget_context_dataメソッドを上書きすればいい。
def get_context_data(self, **kwargs): # Call the base implementation first to get a context context = super().get_context_data(**kwargs) # Add in a QuerySet of all the books context['book_list'] = Book.objects.all() return context
この例ではmodel = Fuga と指定したのに加えて他の変数(book_list)を指定してる。
django2.xになってチュートリアルが変わって、フォームの章がないのと、今後はあんまり関係なさそうなのでいったんここで終了します。