将视图中的 Django 查询集传递给模板

Posted

技术标签:

【中文标题】将视图中的 Django 查询集传递给模板【英文标题】:Passing Django Queryset in Views to Template 【发布时间】:2018-07-10 16:17:41 【问题描述】:

我有一个 Django Views,它有一些逻辑可以将正确的类别传递给模板。

class ProductListView(ListView):
    model = models.Product
    template_name = "catalogue/catalogue.html"

    def get_queryset(self):
        category = self.kwargs.get("category")
        if category:
            queryset = Product.objects.filter(category__iexact=category)
        else:
            queryset = Product.objects.all()
        return queryset

我不知道如何将它传递给模板,我的模板代码如下:

            % for product in products %
            <tr>   
                <td><h5> product.name </h5>
                <p>Cooked with chicken and mutton cumin spices</p></td>
                <td><p><strong>£  product.price </strong></p></td>
                <td class="options"><a href="#0"><i class="icon_plus_alt2"></i></a></td>
            </tr>
            % endfor %  

我很确定我的模板语法是错误的,但是如何将特定类别传递给模板?因此,如果我有一个名为“电源”的类别,我如何将电源的所有产品传递给模板。

【问题讨论】:

【参考方案1】:

将数据传递到模板上下文的更优雅的方法是使用内置的 view 变量。因此,与其重写 get_context_data() 方法,您可以简单地创建一个返回查询集的自定义方法:

def stores(self):
    return Store.objects.all()

那么你就可以在模板中使用这个了:

% for store in view.stores %
  ...
% endfor %

另见:

https://reinout.vanrees.org/weblog/2014/05/19/context.html https://docs.djangoproject.com/en/dev/releases/1.5/#new-view-variable-in-class-based-views-context

【讨论】:

【参考方案2】:

可以添加如下方法

def get_context_data(self, **kwargs):
    context = super(ProductListView, self).get_context_data(**kwargs)
    some_data = Product.objects.all()
    context.update('some_data': some_data)
    return context

所以现在,在您的模板中,您可以访问some_data 变量。您还可以根据需要添加尽可能多的数据来更新上下文字典。

如果您仍想使用get_queryset 方法,那么您可以在模板中以object_list 的身份访问该查询集

% for product in object_list %
...
% endfor %

【讨论】:

【参考方案3】:

ListView 中查询集中的项目在模板中以object_list 的形式提供,因此您需要执行以下操作:

% for product in object_list %
            <tr>   
                <td><h5> product.name </h5>
                <p>Cooked with chicken and mutton cumin spices</p></td>
                <td><p><strong>£  product.price </strong></p></td>
                <td class="options"><a href="#0"><i class="icon_plus_alt2"></i></a></td>
            </tr>
            % endfor %

您可以在ListView documentation 中找到详细信息。注意一个名为get_context_data 的方法——它返回一个变量和值的字典,这些字典将被传递给模板。你总能在源代码中找到它为什么会这样工作。

【讨论】:

即使我在模板中添加 product_list - 是什么告诉视图传递特定类别?模板上没有定义任何内容。例如,我是否需要在 product_list 中输入 % for product.mains % @Rutnet 我刚刚注意到我复制粘贴了您的代码但没有更改它。只需执行 `% for product in object_list %。我现在修复了代码示例。 谢谢,但仍然没有回答我如何从模板中传递特定类别。如何获取属于“主电源”类别的所有产品 列表视图将其传递给您的模板。它通过了get_queryset 的结果 它返回数据库中的所有产品。如何在模板上指定具体类别?

以上是关于将视图中的 Django 查询集传递给模板的主要内容,如果未能解决你的问题,请参考以下文章

将模板中的值传递给 Django 中的视图

将模板中的按钮中的 id 传递给 Django 视图

将 request.user 传递给 Django 中的模板

将对象从模板传递给 django 视图(控制器)

Django:将会话信息传递给下一个模板和视图

如何在 django 的基于类的视图中将值传递给模板?