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

Automatically set the value of next in all django CBV

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

  1. 尝试前往URL。 (=> 应成为 'next' 参数)

  2. 你被重定向到登录页面,因为你没有登录。

  3. 登录后,应该会带您到'next.'

到目前为止,我在 S.O 上看到过,没有人以这种方式构建他们对 next 的用法。而且文档根本​​没有帮助。其他人都问如何重定向 如果您明确单击登录

我是否必须修改每个 CBV 中的每个 get_success_url() 或 get_context_data() 方法才能正确地为其提供 'next' 参数?我什至不知道哪个视图实际上在说 "oh you're not logged in, go to /login/ ," 因为如果我能说我至少可以尝试覆盖该方法并给它 request.path 参数。我假设它是 AuthenticationMiddleware 或 LoginRequiredMiddleware

显然它不是 "LoginView" (django 1.11) 因为当我在 dispatch 方法上放置一个断点时,它在任何地方都看不到我最初尝试的 URL,它只是看到

request.path = '/登录/'

如何获取 "originally intended url" 的值并将其设置为 'next' 参数,以便它重定向到 '/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 请直说。不过,我认为这在这里并不重要,因为我在传递 'next' 时没有问题,只要它首先位于 context 中。

使用下面的中间件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',
)