Skip to main content
 首页 » 编程设计

python之Django: ListView 。我在哪里可以声明我想在模板上拥有的变量

2024年08月22日28bonelee

我的应用程序中的一个表称为 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 的模板中可能更清晰。