Как добавить элементы к данным контекста в ListView? - PullRequest
0 голосов
/ 11 января 2020

Я использую собственный миксин в ListView и хочу добавить values для указания c key (list?) К переменной 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?

1 Ответ

0 голосов
/ 11 января 2020

ListView возвращает список экземпляров модели (или других объектов) , полученных в результате использования метода get_queryset(). Обычно это QuerySet для извлечения некоторых объектов модели, но может быть любой итеративный .

В вашем примере нет кода на то, как атрибут mylist должен первоначально появляются в контексте представления.

Во-первых, вам нужно определить get_queryset метод для возврата итерируемых требуемых объектов.

Или вы можете установить его в классе атрибут уровня queryset, однако он может быть не очень динамичным c.

Далее вы можете определить имя переменной контекста, которая будет использоваться для хранения списка данных, которыми это представление манипулирует, - либо с помощью context_object_name атрибут класса или в случае, если для каждого запроса требуется динамическое c имя - с помощью метода get_context_object_name .

Кроме того, атрибут уровня mylist класса недоступно __ для экземпляров классов (доступ к ним осуществляется как self) until set in __ init method. You can access it as a class attribute MyList.mylist` или просто определяется на уровне метода как локальная переменная.

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
...