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

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

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

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

Q&A

解決済

1回答

2228閲覧

djangoの汎用ビューを使用したときのの質問です

masafumi_kishid

総合スコア8

Django

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

0グッド

0クリップ

投稿2018/09/26 07:10

djangoの汎用ビューを使用したときのの質問です。

あるobject(Question)の詳細表示をするというコードです

モデルQuestionは

import datetime from django.db import models from django.utils import timezone # Create your models here. class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text def was_published_recently(self): now = timezone.now() return now - datetime.timedelta(days=1) <= self.pub_date <= now

viewのコードは

from django.http import HttpResponseRedirect #from django.template import loader from django.shortcuts import get_object_or_404, render #from django.http import Http404 from django.urls import reverse from django.views import generic from .models import Question, Choice # class IndexView(generic.ListView): template_name = 'polls/index.html' context_object_name = 'latest_question_list' def get_queryset(self): return Question.objects.order_by('-pub_date')[:5] # class DetailView(generic.DetailView): model = Question template_name = 'polls/detail.html' #

テンプレート'polls/detail.html'は

<h1>{{ question.question_text }}</h1> {% if error_message %} <p><strong>{{ error_message }}</strong></p> {% endif %} <form action="{% url 'polls:vote' question.id %}" method="post"> {% csrf_token %} {% for choice in question.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}"> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br> {% endfor %} <input type="submit" value="Vote"> </form>

質問

上記class DetailViewではmodel = Questionでモデルの情報を渡していて、テンプレートpolls/detail.htmlでは<h1>{{ question.question_text }}</h1>で参照している。
大文字Questionと小文字qestionでは解決できないのではないでしょうか。
ところがこのコードは実際正常に動作しています。
解説文では**__ Django モデル (Question) を使用していて、 Django はコンテキスト変数にふさわしい名前を決めることができるからです。__**
とありますがどうなんでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

小文字のquestionという変数名は、モデル名とマッチさせているのではなく、DetailViewが内部で作っているものです。
DetailViewは、あるモデルに属する特定のオブジェクトをTemplateから簡単に参照できるようにするためのものです。内部では、モデル名を小文字にしたものを変数名・オブジェクトを値とし、get_context_dataメソッドをオーバーライドしてTemplateに渡す処理を行っています。

内部の処理が知りたい場合は、このあたりのコードを参考にしてください。
https://github.com/django/django/blob/master/django/views/generic/detail.py#L91
https://github.com/django/django/blob/master/django/db/models/options.py#L159

投稿2018/09/26 09:02

Udomomo

総合スコア1524

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

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

masafumi_kishid

2018/09/26 09:13

よく分かりました。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問