在django中,通用视图的工作原理

时间:2017-05-19 22:16:15

标签: python django generics

我已经开始学习django,我不确定通用视图是如何工作的。我多次阅读django文档,我无法清楚地了解泛型视图的工作原理。很奇怪,但效果很好。它从数据库中检索数据并在浏览器上呈现数据。

以下是 polls / urls.py 的摘录代码。

url(r'^$', views.IndexView.as_view(), name = 'index')

它将转到 views.py 中的 IndexView 类。

以下是 polls / views.py 的摘录代码。

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]

当我将 template_name 更改为某事时,异常发生如下。

  

TemplateDoesNotExist:polls / question_list.html

question_list.html 是什么意思?

它来自哪里?

这是 index.html

{% if latest_question_list %}
<ul>
    {% for question in latest_question_list %}
    <li>
        <a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>
    </li>
    {% endfor %}
</ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

如您所见, index.html 文件使用 latest_question_list 作为参数,但我不确定如何使用latest_question_list

views.py 文件中, context_object_name ='latest_question_list'是什么意思?

'latest_question_list'来自哪里? index.html 如何使用 latest_question_list

我是否在 views.py 中使用 context_object_name

get_queryset()函数的作用是什么?

2 个答案:

答案 0 :(得分:1)

question_list.html是什么意思?

  

这意味着民意调查目录中有一个文件,如 index.html   如果您想要一个带有diff名称的文件,则必须更改template_name='polls/name_of_file_inside_polls'

的名称

我在views.py中使用context_object_name吗?

  

您可以在上下文中放置一些vars以在模板中使用它,这就是为什么您可以使用 latest_question_list

get_queryset()函数的作用是什么?

  

它创建传递给模板的查询。

答案 1 :(得分:0)

我理解他们的意思。

默认情况下, DetailView 通用视图使用名为 / _ detail.html的模板。在我的情况下,它会使用模板“polls / question_detail。 HTML“即可。 template_name 属性用于告诉Django使用特定模板名称而不是自动生成的默认模板名称。我还为结果列表视图指定了 template_name - 这可以确保结果视图和详细视图在渲染时具有不同的外观,即使它们都是<幕后的strong> DetailView 。

对于 DetailView ,问题变量是自动提供的 - 因为我们使用的是Django模型(问题),Django能够为上下文变量确定一个合适的名称。但是,对于 ListView ,自动生成的上下文变量为 question_list 。要覆盖此项,我们提供 context_object_name 属性,指定我们要使用 latest_question_list