Как визуализировать несколько объектов с использованием представлений на основе классов

Я пытаюсь визуализировать несколько объектов, используя представления на основе классов, но получаю ошибку.

Вот мои коды:

class AssociatedList(WizardRequiredMixin, TemplateView):
    template_name = "profile/associated_accounts.html"

    def get_context_data(self, **kwargs):
        context = super(AssociatedList, self).get_context_data(**context)
        all_envelopes = Envelope.objects.filter(
            user=request.user).exclude_unallocate()
        free_limit = account_limit(request, 15, all_envelopes)
        facebook = FacebookProfile.user_profiles(request.user)
        google = GoogleProfile.user_profiles(request.user)
        twitter = TwitterProfile.user_profiles(request.user)

        context.update = ({
            'facebook': facebook,
            'google': google,
            'twitter': twitter,
            'free_limit': free_limit,
        })
        return context

Ошибка:

  local variable 'context' referenced before assignment

3 ответа

Решение

Я всегда переопределен get_context_data позвонив super в начале функции и затем добавляя контекст -

def get_context_data(self, *args, **kwargs):
    context = super(AssociatedList, self).get_context_data(*args, **kwargs)
    all_envelopes = Envelope.objects.filter(
        user=self.request.user).exclude_unallocate()
    free_limit = account_limit(self.request, 15, all_envelopes),
    facebook = FacebookProfile.user_profiles(self.request.user),
    google = GoogleProfile.user_profiles(self.request.user),
    twitter = TwitterProfile.user_profiles(self.request.user),

    context.update({
        'facebook': facebook,
        'google': google,
        'twitter': twitter,
        'free_limit': free_limit,
    })
    return context

Это шаблон, используемый в документах здесь.

ОБНОВИТЬ

Ошибка, которую вы только что добавили, предполагает ошибку в вашем классе. Похоже, вам нужно определить либо queryset атрибут или model приписывать.

ListView класс, от которого вы наследуете, требует, чтобы вы либо определили модель, которую возвращает представление (т.е. YourModel.objects.all()). Или же конкретный набор запросов, который будет возвращен (например, YourModel.objects.filter(your_field=some_variable)).

Поскольку это ListView, вы должны сообщить ему, что вы собираетесь перечислить с model или же queryset, Вы не хотите использовать ListView в этом случае, так как вы переопределяете get_context_data так что вы, вероятно, должны использовать TemplateView или что-то подобное.

Попробуйте что-то вроде этого:

class AssociatedList(WizardRequiredMixin, ListView):
    template_name = "profile/associated_accounts.html"
    model = Envelope 

    def get_queryset(self):
        return Envelope.objects.filter(user=self.request.user).exclude_unallocate()

    def get_context_data(self, **kwargs):
        context = super(AssociatedList, self).get_context_data(**kwargs)
        context.update({
            'facebook': FacebookProfile.user_profiles(self.request.user),
            'google': GoogleProfile.user_profiles(self.request.user),
            'twitter': TwitterProfile.user_profiles(self.request.user),
            'free_limit': account_limit(self.request, 15, context['envelope_list']),
        })
        return context

Вам не нужна модель, имеющая набор запросов, но это хорошая практика для ее определения. В шаблоне используйте object_list или envelope_list вместо all_envelopes, и вы должны хорошо идти.

PS http://ccbv.co.uk/ хороший источник знаний о CBV.

Другие вопросы по тегам