在Django中注册后保持路径重定向

时间:2017-04-19 17:53:37

标签: python django django-models django-forms django-views

用户需要拥有一个帐户才能使用该服务。用户单击发送给他们的链接后,如果他们没有帐户,系统会提示他们注册一个帐户。但是,在他们注册后,他们需要重定向回他们点击的原始链接。我不知道该如何去做,因为我不熟悉Django中基于类的视图。我在views.py中有注册表的以下类:

class SignUpView(bracesviews.AnonymousRequiredMixin,
             bracesviews.FormValidMessageMixin,
             generic.CreateView):
    form_class = forms.SignupForm
    model = User
    template_name = 'accounts/signup.html'
    success_url = reverse_lazy('home')
    form_valid_message = "You're signed up!"

    def form_valid(self, form):
        r = super(SignUpView, self).form_valid(form)
        username = form.cleaned_data["email"]
        password = form.cleaned_data["password1"]
        user = auth.authenticate(email=username, password=password)
        auth.login(self.request, user)
        return r

然后,在forms.py中,我有以下内容:

class SignupForm(authtoolsforms.UserCreationForm):
    def __init__(self, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.fields["email"].widget.input_type = "email"  # ugly hack
        self.helper.layout = Layout(
            Field('type', placeholder='recruiter'),
            Field('email', placeholder="Enter Email", autofocus=""),
            Field('name', placeholder="Enter Full Name"),
            Field('password1', placeholder="Enter Password"),
            Field('password2', placeholder="Re-enter Password"),
            Submit('sign_up', 'Sign up', css_class="btn-warning"),
            )

我正在考虑在函数中使用self.request.path来获取"?next ="之后的路径。在网址中,因为我能够成功地使用登录重定向到原始链接,但我不确定如何通过注册保留网址。

非常感谢任何指导!

1 个答案:

答案 0 :(得分:1)

您可以使用内置的上下文处理器执行此操作,方法是在注册页面URL的末尾添加请求路径。

如果您有一个指向用户点击的注册页面的链接,您可以包含请求路径,如下所示:

<a href="{% url 'user-signup' %}?next={{ request.path }}">Signup</a> 

如果要从视图重定向用户,请在视图中附加带有请求对象的下一个参数,如下所示:

from django.http import HttpResponseRedirect
from django.urls import reverse

class ClassViewThatRedirectsUser(View):
  def get(self, *args, **kwargs):
    return HttpResponseRedirect("%s%s%s" % (reverse('user-signup'), "?next=", self.request.path))

确保您的设置文件中包含上下文处理器,对于Django 1.10,它包含在TEMPLATES中的OPTIONS下,它将如下所示:

TEMPLATES = [
{
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },