Django 1.7通用视图

时间:2015-01-20 23:10:55

标签: python django django-1.7

我目前正在浏览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>

现在,我了解ListViewDetailView是Django提供的默认通用视图。

DetailViewResultsView如何在questiondetail.html中生成result.html上下文变量?此外,error_message生成的detail.html内的DetailView上下文变量如何?

2 个答案:

答案 0 :(得分:2)

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.",
})

答案 1 :(得分:1)

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

它使用模型的名称。然后get_context_data的{​​{1}}将该标识符放在上下文中。在任何情况下,您还可以使用SingleObjectMixin标识符访问该对象。

我确信您可以在Django文档中阅读所有内容,但有a nice page where you can explore class based views