2013-03-03 4 views
0

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

Вот мои коды:

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 
+1

Какая ошибка? – Ngenator

+0

@Ngenator Я публикую сообщение об ошибке – catherine

+1

Как отмечает Ngenator в комментарии к моему ответу, вы указали ссылку на «контекст» в заявлении, определяющем «контекст». Это была ошибка копирования и вставки с моей стороны. Я обновил свой ответ, просто замените «** context» на «* args, ** kwargs» в первой строке функции. –

ответ

2

Я всегда переопределяется 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 

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

UPDATE

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

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

+0

Я думал то же самое. @catherine это устранить проблему? – Ngenator

+0

Нет, я попробовал ответить, но я получил ту же ошибку – catherine

+0

Хорошо, вот новая ошибка после добавления модели, локальная переменная 'context', на которую ссылаются перед назначением – catherine

1

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

+0

Я действительно не знаю о классах. Каким будет правильный вид, который я использую для визуализации нескольких запросов? – catherine

+0

В этом случае, поскольку вы переопределяете метод get_context_data', TemplateView будет работать. – Ngenator

1

попробовать что-то вроде этого:

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 

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

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

+1

он даст мне ошибку о запросе не определен – catherine

+0

Вы правы. Ред. –

+0

ваш запрос имеет также request.user, как бы вы назвали себя? – catherine