0

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

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

1 回答 1

3

您可以装饰视图

要么在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)

或者,您可以继承LoginRequiredMixindjango-braces

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 的原始 URL。
  4. #3 的视图将显示一个登录表单。
  5. 一旦用户成功通过身份验证,来自#3 的视图将更新会话,并将用户重定向到next参数中的 URL。

如果用户已登录,则装饰视图将正常执行。

于 2013-09-07T20:03:23.907 回答