首页 > 解决方案 > 如何将项目附加到 ListView 中的上下文数据?

问题描述

我在 a 中使用自定义 mixinListView并希望将values特定keylist?)添加到context变量中:

class MyMixin:
    mylist = ['itemA']

class MyList(MyMixin, ListView):
    mylist = ['item1','item2']

    def get_context_date(self, **kwargs):
        context = super(ListView, self).get_context_data(**kwargs)
        context['mylist'].append(self.mylist)
    return context

期望的结果是mylist = ['itemA', 'item1', 'item2']

但是,这会导致key_error. 将键值附加到的正确方法是context什么?

标签: djangodjango-views

解决方案


ListView是返回作为方法结果检索的模型实例(或其他对象)的列表get_queryset()。这通常是QuerySet检索一些模型对象但可以是任何可迭代的。

在您的示例中,没有关于mylist属性最初应如何出现在视图上下文中的代码。

首先,您需要定义get_queryset方法以返回所需对象的可迭代。

或者,您可以在类级别属性中设置它queryset,但它可能不是很动态。

接下来,您可以使用get_context_object_name方法定义将用于包含此视图正在操作的数据列表的上下文变量名称 - 使用context_object_name类属性或在每个请求都需要动态名称的情况下。

此外,类级mylist属性在类实例上不可用 __ (作为__init MyList.mylist 访问或简单地在方法级别上定义为局部变量。self) until set inmethod. You can access it as a class attribute

class MyList(MyMixin, ListView):
    context_object_name "mylist"

    def get_queryset(self):
        # some logic to return required data of this view
        # or simply
        # return ['itemA']
        return SomeModel.objects.all().values_list('name', flat=True)

    def get_context_data(self, **kwargs):
        context = super(ListView, self).get_context_data(**kwargs)
        mylist = ['item1','item2']
        context['mylist'].append(mylist)
        return context

推荐阅读