2013-09-07 4 views
0

모든 내 페이지에 포함하려는 로그인 클래스 기반보기가 있습니다. 클래스 기반보기를 템플릿 컨텍스트 프로세서로 포함시키는 방법이 있습니까? 아니면 모든 페이지에 다른 방법을 포함시킬 수 있습니까? 당신이 LoginRequiredMixin에서 django-braces에서 상속 할 수클래스 기반 뷰가있는 Django 템플릿 컨텍스트 프로세서

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 
from django.views.generic import TemplateView 

class ProtectedView(TemplateView): 
    template_name = 'secret.html' 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(ProtectedView, self).dispatch(*args, **kwargs) 

을 또는 :

어느 urls.py에서와 :

from django.contrib.auth.decorators import login_required, permission_required 
from django.views.generic import TemplateView 

from .views import VoteView 

urlpatterns = patterns('', 
    (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))), 
    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())), 
) 

또는 views.py에서

class LoginView(RedirectAuthenticatedUserMixin, FormView): 
     form_class = LoginForm 
     template_name = "account/login.html" 
     success_url = None 
     redirect_field_name = "next" 

     def form_valid(self, form): 
      success_url = self.get_success_url() 
      return form.login(self.request, redirect_url=success_url) 

     def get_success_url(self): 
      # Explicitly passed ?next= URL takes precedence 
      ret = (get_next_redirect_url(self.request, 
             self.redirect_field_name) 
        or self.success_url) 
      return ret 

     def get_context_data(self, **kwargs): 
      ret = super(LoginView, self).get_context_data(**kwargs) 
      signup_url = passthrough_next_redirect_url(self.request, 
                 reverse("account_signup"), 
                 self.redirect_field_name) 
      redirect_field_value = self.request.REQUEST \ 
       .get(self.redirect_field_name) 
      ret.update({"signup_url": signup_url, 
         "site": Site.objects.get_current(), 
         "redirect_field_name": self.redirect_field_name, 
         "redirect_field_value": redirect_field_value}) 
      return ret 

    login = LoginView.as_view() 
+0

그건 의미가 없습니다. 뷰는 컨텍스트 프로세서가 아니며 뷰입니다. 정확히 각 페이지에 무엇을 포함 시키길 원하십니까? –

답변

2

당신은 decorate the view

from braces.views import LoginRequiredMixin 

class Index(LoginRequiredMixin, TemplateView): 
    template_name = 'sekret.html' 

이 모든 예에서는 클래스 기반보기 (내가 수행하려는 것으로 믿는)에 인증을 요구하는 방법을 보여줍니다. 처음 두 개는 문서에서 직접 가져온 것입니다.

위의 예 중 하나를 구현하면, 응용 프로그램은 다음과 같이 작동합니다 :

  1. 사용자는 위의보기 중 하나에 매핑되는 URL을 입력합니다.
  2. 장고 미들웨어 검사 사용자가 로그인되어있는 경우.
  3. 하지 않으면, 장고는 # 1에서 원래 URL을 가리키는, 기본의 /accounts/login/으로, LOGIN_URL로 리디렉션 및 ?next 매개 변수를 추가합니다.
  4. 3 번 화면에서 로그인 양식이 표시됩니다.
  5. 사용자가 성공적으로 인증되면 # 3의보기가 세션을 업데이트하고 next 매개 변수의 URL로 사용자를 리디렉션합니다.

사용자가 로그인하면 데코 레이팅 된보기가 정상적으로 실행됩니다.

관련 문제