我的应用程序中的一个表名为Gallery
,我有以下类列出该表中的所有对象:
from django.views.generic import ListView
from galleries.models import Gallery
class GalleryList(ListView):
template_name = "path/to/template"
context_object_name = "object_list"
def queryset(self):
return Gallery.objects.order_by('-title')[:20]
它完成了这项工作。在我的模板上,我执行以下操作:
{% block gallery_list %}
<h1>Gallery List</h1>
<ul>
{% for gallery in object_list %}
<li><img src="{{ gallery.thumbnail.url }}" />{{ gallery.title }}</li>
{% endfor %}
</ul>
{% endblock %}
一切都按预期工作。这里的问题是,在我的base.html
模板上,{% block title %}
代码为meta title
,标题中为{% block description %}
代码meta description
。我希望能够在某处声明它并将其传递给视图。需要明确的是,变量title
和description
是字符串(例如:title="List of all galleries on website"
)。
在视图中我想做类似的事情:
{% extends "base.html" %}
{% block title %}{{ title }}{% endblock %}
{% block description %}{{ description|default:title }}{% endblock %}
但是,在课程GalleryList
上,我不知道在哪里声明变量title
和description
。我不知道Django是否可行或适当。我想做对的。
另外,因为我有一个服装模板可以列出我可以做的所有画廊:
{% extends "base.html" %}
{% block title %}List of all galleries on website{% endblock %}
{% block description %}List of all galleries on website...{% endblock %}
但话说回来,我不知道这对于编码良好的Django应用程序是否合适。我是Django的初学者,我想知道如何解决这个问题。希望我的问题很清楚。
答案 0 :(得分:3)
您可以覆盖ListView
s get_context_data
method以向上下文添加任何其他上下文变量:
class GalleryList(ListView):
def get_context_data(self, **kwargs):
ctx = super(GalleryList, self).get_context_data(**kwargs)
ctx['title'] = 'My Title'
ctx['description'] = 'My Description'
return ctx
另一种方法 - 拥有填写此信息的模板 - 也是合理的。哪个更好取决于数据的动态程度。如果标题/描述基于模型数据或某些其他因素,那么在视图中设置它是有意义的。如果针对特定模板进行了修复,那么放入base.html
扩展的模板可能会更加清晰。