我的应用程序中的一个表称为 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 标记。我希望能够在某处声明它并将其传递给 View 。需要明确的是,变量 title 和 description 是字符串(例如:title="网站上所有画廊的列表")。
在 View 上我想做类似的事情:
{% 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 的初学者,我想知道解决这个问题的方法。希望我的问题足够清楚。
请您参考如下方法:
您可以覆盖 ListView 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
另一种方法——使用一个模板来填充这些信息——也很不错。哪个更好实际上取决于数据的动态程度。如果标题/描述是基于模型数据或其他一些因素,那么在 View 中设置它是有意义的。如果它针对特定模板是固定的,那么将其放入扩展 base.html 的模板中可能更清晰。
