2016-09-21 81 views
1

编辑: 我知道我可以更改变量的名称。我的问题是,我不想这样做。我想知道django自动生成的所有变量。模板的Django上下文变量名称


我做Django的入门教程,我在哪里,在一个点上它解释了generic views section

在本教程的前面部分,模板已提供 有包含问题的上下文和latest_question_list 上下文变量。对于DetailView,问题变量自动提供 - 由于我们使用的是Django模型(问题),Django的 能够为上下文变量确定合适的名称。 但是,对于ListView,自动生成的上下文变量是 question_list。

我的问题是,我不知道Django如何确定这个“适当的名称”。当我编写自己的模板时,我想知道这一点。我想知道在这样的模板中使用什么上下文变量名称。

根据我的理解,如果我的模型是Questionquestion上下文变量将存储该问题,而question_list上下文变量将存储每个问题。

所以我的疑问是:还有什么其他的上下文变量名称可以使用?他们会存储什么?我似乎无法在文档中找到它,如果你知道它在哪里,请将它重定向到它。

+0

仅供参考,您可以设置背景模板变量自己设置'context_object_name ='yourname'作为视图属性。 – makaveli

+0

是的,我知道我可以自己设定这个名字。我的问题是,我不想设置这些名称。我想知道django自动生成的变量是什么 – Adocad

回答

1

您可以通过其他使用context_object_name这不是在的那部分解释那么好改变question_list的东西文档,但是...

返回将用于包含此视图操作数据的列表 的上下文变量名称。如果object_list是Django对象的查询集 ,并且未设置context_object_name,则上下文名称 将作为查询集由 组成的模型的model_name,并附加后缀'_list'。例如,模型文章 将具有名为article_list的上下文对象。

get_context_object_name方法给出

这是该方法的code的样子,它应该清理所有的疑虑:

""" 
    Get the name of the item to be used in the context. 
    """ 
    if self.context_object_name: 
     return self.context_object_name 
    elif hasattr(object_list, 'model'): 
     return '%s_list' % object_list.model._meta.model_name 
    else: 
     return None 
+0

我认为每个通用视图都会生成多个上下文变量。该[代码](https://github.com/django/django/blob/master/django/views/generic/list.py)帮助。谢谢 – Adocad

+0

很高兴有帮助 – e4c5

1

我认为这个默认的上下文变量名只适用于处理Django的基于类的视图。

E.g.如果您使用DetailView作为动物模型,Django会自动创建一个名为'animal'的上下文变量供您在模板中使用。我认为它也允许使用“对象”。

另一个例子,正如你所提到的,动物模型的ListView可以生成名为animal_list的上下文名称。

但是,在这两种情况下,都有方法可以更改默认的上下文变量名称。如果您在DetailView中指定了'context_object_name',这将是您在模板中引用的名称。这也适用于ListViews。

本网站对所有的Django版本的CBVS所有信息:

https://ccbv.co.uk/projects/Django/1.9/django.views.generic.detail/DetailView/