2013-03-03 2 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 

오류 : 난 항상 상황에 맞는 함수의 시작 부분에 super를 호출 한 후 추가하여 get_context_data를 오버라이드 (override) 한

local variable 'context' referenced before assignment 
+1

무엇이 오류입니까? – Ngenator

+0

@Ngenator 오류를 게시합니다 – catherine

+1

Ngenator가 내 대답에 대한 의견에서 지적했듯이 '컨텍스트'를 정의하는 문에 '컨텍스트'에 대한 참조가 포함되었습니다. 그것은 내 부분에 복사 및 붙여 넣기 오류가 발생했습니다. 내 대답을 업데이 트했습니다, 그냥 '** contexts'를 '* args, ** kwargs'로 바꾸십시오. 함수의 첫 번째 줄에. –

답변

2

-

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 속성을 정의해야하는 것 같습니다.

상속 받고있는 클래스는 View가 반환하는 모델 (예 : YourModel.objects.all())을 정의해야합니다. 아니면 반환 될 특정 쿼리 세트 (예 : YourModel.objects.filter(your_field=some_variable)).

+0

나는 똑같은 생각을하고있었습니다. @ 캐서린이 문제를 해결 했습니까? – Ngenator

+0

아니요, 여전히 같은 오류가 발생했습니다. – catherine

+0

여기에 모델, 로컬 변수 'context'를 할당하기 전에 새 오류가 있습니다. – catherine

1

ListView이기 때문에 표시 할 내용을 model 또는 queryset으로 지정해야합니다. get_context_data을 재정의했기 때문에이 경우 ListView를 사용하지 않으려 고 TemplateView 또는 비슷한 것을 사용해야합니다. 이 같은

+0

클래스 기반 뷰에 대해서는 정말 몰라요. 여러 개의 쿼리 세트를 렌더링하는 데 사용하는 올바른보기는 무엇입니까? – catherine

+0

이 경우, get_context_data 메소드를 오버라이드 (override)하고 있기 때문에, 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 

당신은 검색어 세트를 가진 모델이 필요하지 않지만, 그것을 정의하는 것이 좋습니다. 템플릿에서 all_envelopes 대신 object_list 또는 envelope_list를 사용하면 좋을 것입니다.

P. http://ccbv.co.uk/ CBV에 대한 지식의 좋은 소스.

+1

요청에 대해 정의되지 않은 오류가 발생합니다. – catherine

+0

맞습니다. 편집 됨. –

+0

당신의 쿼리 세트도 request.user를 가지고 있습니다, 당신은 어떻게 자기를 부를까요? – catherine