【问题标题】:Redirect to next url in Django with FormView使用 FormView 重定向到 Django 中的下一个 url
【发布时间】:2015-09-25 18:28:13
【问题描述】:

我的登录重定向到FormView 时遇到问题。它总是将我重定向到accounts/profile/,接下来url/accounts/login/?next=/add/posts/ 应该将我带到网址add/post/

class LoginForm(FormView):
    form_class = AuthenticationForm
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'accounts/login.html'
    success_url = ''

    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, *args, **kwargs):
        return super(LoginForm, self).dispatch(*args, **kwargs)

    def form_valid(self, form):

        self.check_and_delete_test_cookie()
        login(self.request, form.get_user())
        return super(LoginForm, self).form_valid(form)

    def form_invalid(self, form):

        self.set_test_cookie()
        return super(LoginForm, self).form_invalid(form)

    def get_success_url(self):
        if self.success_url:
            redirect_to = self.success_url
        else:
            redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')

        netloc = urlparse.urlparse(redirect_to)[1]
        if not redirect_to:
            redirect_to = settings.LOGIN_REDIRECT_URL
            redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)


        elif netloc and netloc != self.request.get_host():
            redirect_to = settings.LOGIN_REDIRECT_URL
            redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
        return redirect_to

    def set_test_cookie(self):
        self.request.session.set_test_cookie()

    def check_and_delete_test_cookie(self):
        if self.request.session.test_cookie_worked():
            self.request.session.delete_test_cookie()
            return True
        return False

    def get(self, request, *args, **kwargs):

        self.set_test_cookie()
        return super(LoginForm, self).get(request, *args, **kwargs)

【问题讨论】:

标签: python django


【解决方案1】:

我曾经有一个自定义类来处理这个小功能,例如:

from django.urls import reverse_lazy

class NextUrlMixin(object):
    """ Allows to redirect a view to its correct success url. """
    def get_success_url(self):
        if 'next' in self.request.GET:
            return self.request.GET.get('next')
        return reverse_lazy('index')

并在您的 CBV 中使用它:

class LoginForm(NextUrlMixin, FormView):
     # rest of your code

(注意:对于 Djangofrom django.core.urlresolvers import reverse_lazy)

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多