0

我在models.py中有模型:

class Category(models.Model):
    name = models.CharField('Nazwa Kategorii', max_length=100)
    slug = models.SlugField('Odnośnik', unique=True, max_length=100)
    icon = models.ImageField('Ikonka Kategorii', upload_to='icons',
                              blank=True)
    class Meta:
        verbose_name = "Kategoria"
        verbose_name_plural = "Kategorie"

    def __unicode__(self):
        return self.name

我想查看所有类别的列表:views.py

class CategoryList(generic.ListView):
    model = models.Category
    context_object_name = 'category_list'
category_list = CategoryList.as_view()

在 base.html 我有:

{% for entry in category_list %}
<li><a href="#">{{ entry.name }} </a></li>
{% endfor %}

但它不会返回任何类别。我想念什么?我想添加带有类别列表的基本模板菜单..

4

1 回答 1

2

您不应期望为 base.html 设置category_list上下文变量。CategoryList 类视图默认使用模板'< app_name >/category_list.html'。您可以通过为此视图设置template_names属性来更改此设置。

如果您希望在所有模板中都可以访问“category_list”上下文变量(考虑到您尝试在 base.html 中使用,这是可能的),您需要定义上下文处理器并将此变量添加到上下文中。

您需要的上下文处理器可能如下所示:

def menu_processor(request):
    return {
        'category_list': Category.objects.all() 
    } 

一旦你在代码中的某个地方定义了这个函数(在相关应用程序中放入 context_processors.py 是一个很好的做法),你需要在 TEMPLATE_PROCESSORS 设置变量中注册它(参见上面的 django 文档链接以供参考)。

这里要提到的最后一件事是您应该考虑缓存查询结果,因为此代码将在每个请求上执行。

于 2013-01-15T18:55:15.953 回答