在所有django CBV中自动设置next的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在所有django CBV中自动设置next的值相关的知识,希望对你有一定的参考价值。

我希望我的网站像这样工作:

  1. 尝试转到URL。 (=>应该成为'下一个'参数)
  2. 您将被重定向到登录页面,因为您尚未登录。
  3. 登录后,它会带你到“下一个”。

从来没有人以这种方式构建他们对next的使用,到目前为止我已经在S.O.上看到了。并且文档根本​​没有帮助。如果您明确单击“登录”,其他人都会询问如何重定向。

我是否必须在每个CBV中修改每个get_success_url()或get_context_data()方法以正确地为其提供'next'参数?我甚至不知道哪个视图实际上在说“哦,你没有登录,转到/ login /”,因为如果我能说我至少可以尝试覆盖该方法并给它request.path参数。我假设它是AuthenticationMiddleware,或LoginRequiredMiddleware

显然它不是“LoginView”(django 1.11),因为当我在那里的调度方法上放置断点时,它在任何地方都看不到我原来的尝试URL,它只是看到

request.path ='/ login /'

如何获取“原始目标网址”的值并将其设置为“下一个”参数,以便重定向到'/ login /?next = next_page'而不是'/ login /?

urlpatterns = [
url(r'^login/$',
    login,
    {
        'template_name': 'login.html',
        'authentication_form': BootstrapAuthenticationForm,
        'extra_context':
        {
            'title': 'Log in',
            'year': timezone.now().year,
        },
    },
    name='login'),
url(r'^logout$',
    logout,
    {
        'next_page': 'login',
    },
    name='logout'),

如果你想看到我的login.html,请说出来。我认为这并不重要,因为我在传递'下一个'时没有问题,只要它首先在上下文中。

答案

使用以下中间件TomasTomecek

# in settings.py

LOGIN_URL = '/login/'

LOGIN_EXEMPT_URLS = (
 r'^about.html$',
 r'^legal/', # allow any URL under /legal/*
) 

MIDDLEWARE_CLASSES = (
    # ...
    'python.path.to.LoginRequiredMiddlewareFromTomasTomecek',
)

以上是关于在所有django CBV中自动设置next的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要在 Django 中将 kwargs 设置为 CBV 的参数

如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

Django - CBV与FBV

Django在CBV中使用,用户登录验证组件

使用Ajax (put delete ) django原生CBV 出现csrf token解决办法

Django 的 cbv