Django 1.7 通用视图
Django 1.7 generic views
我目前正在阅读 Django 的官方教程,但在尝试理解通用视图的实际工作方式时遇到了问题。
源码来自官方文档:
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
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>
results.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
现在,我了解到 ListView
和 DetailView
是 Django 提供的默认通用视图。
DetailView
和ResultsView
如何在detail.html
和result.html
中生成question
上下文变量?另外, DetailView
生成的 detail.html
中的 error_message
上下文变量是如何生成的?
question
对象以通用视图的 model
属性命名(在本例中为 Question
)。详细视图自动包含此类对象。
如果您询问如何选择特定的 question
对象,详细视图默认情况下必须从 URL 传递一个 pk
值,然后用于查找该对象。 polls/urls.py中的相关代码如下:
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
另一方面,error_message
不包含在通用视图中。它仅在非通用视图的示例中使用,因为该示例将其明确包含在上下文中:
return render(request, 'polls/detail.html', {
'question': p,
'error_message': "You didn't select a choice.",
})
DetailView 有一个 context_object_name
参数,你可以用它来设置模板中对象的名称,但如果你不设置它,get_context_object_name
方法会这样做:
def get_context_object_name(self, obj):
"""
Get the name to use for the object.
"""
if self.context_object_name:
return self.context_object_name
elif isinstance(obj, models.Model):
return obj._meta.model_name
else:
return None
它使用模型的名称。然后 SingleObjectMixin
的 get_context_data
将该标识符放入上下文中。在任何情况下,您还可以使用 object
标识符访问对象。
我相信您可以在 Django 文档中阅读所有这些内容,但是 a nice page where you can explore class based views
我目前正在阅读 Django 的官方教程,但在尝试理解通用视图的实际工作方式时遇到了问题。
源码来自官方文档:
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
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>
results.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
现在,我了解到 ListView
和 DetailView
是 Django 提供的默认通用视图。
DetailView
和ResultsView
如何在detail.html
和result.html
中生成question
上下文变量?另外, DetailView
生成的 detail.html
中的 error_message
上下文变量是如何生成的?
question
对象以通用视图的 model
属性命名(在本例中为 Question
)。详细视图自动包含此类对象。
如果您询问如何选择特定的 question
对象,详细视图默认情况下必须从 URL 传递一个 pk
值,然后用于查找该对象。 polls/urls.py中的相关代码如下:
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
另一方面,error_message
不包含在通用视图中。它仅在非通用视图的示例中使用,因为该示例将其明确包含在上下文中:
return render(request, 'polls/detail.html', {
'question': p,
'error_message': "You didn't select a choice.",
})
DetailView 有一个 context_object_name
参数,你可以用它来设置模板中对象的名称,但如果你不设置它,get_context_object_name
方法会这样做:
def get_context_object_name(self, obj):
"""
Get the name to use for the object.
"""
if self.context_object_name:
return self.context_object_name
elif isinstance(obj, models.Model):
return obj._meta.model_name
else:
return None
它使用模型的名称。然后 SingleObjectMixin
的 get_context_data
将该标识符放入上下文中。在任何情况下,您还可以使用 object
标识符访问对象。
我相信您可以在 Django 文档中阅读所有这些内容,但是 a nice page where you can explore class based views