基于类视图的Django模板上下文处理器

时间:2013-09-07 19:44:10

标签: django django-templates django-views

我有一个基于登录类的视图,我希望将其包含在我的所有页面中。 有没有办法将基于类的视图作为模板上下文处理器包含在内,还是我们还有其他方法可以包含在所有页面中?

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()

1 个答案:

答案 0 :(得分:3)

你可以decorate the view

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

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)

或者,您可以从django-braces

继承LoginRequiredMixin
from braces.views import LoginRequiredMixin

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

所有这些示例都显示了如何要求对基于类的视图进行身份验证(我相信您正在尝试这样做)。前两个直接来自文档。

实施上述任一示例后,您的应用程序将如下所示:

  1. 用户输入映射到上述视图之一的URL。
  2. django中间件检查用户是否已登录。
  3. 如果没有,django将重定向到LOGIN_URL,默认为/accounts/login/,并添加?next参数,指向#1的原始网址。
  4. 来自#3的视图将显示登录表单。
  5. 用户成功通过身份验证后,#3中的视图将更新会话,并将用户重定向到next参数中的网址。
  6. 如果用户已登录,则装饰视图将正常执行。