在Django中注册后重定向到上一页

时间:2015-03-16 20:16:01

标签: django redirect registration create-view

对于登录和注销,我在django.contrib.auth.views中使用Django的内置视图。将用户重定向到上一页非常容易,因为您可以通过“下一步”。登录/注销视图的参数。他们的工作很好。

当我想要实现注册的类似功能时,存在一些问题。似乎Django没有内置的注册视图。因此,我使用CreateView与' model = User'。代码如下:

#views.py

class Registration(CreateView):
    template_name='accounts/registration.html'
    model=User

    #Overwrite form_valid() to log this new user in after his successful registartion
    def form_valid(self, form):
        validation=super(Registration, self).form_valid(form)

        username=form.cleaned_data['username']
        password=form.cleaned_data['password2']
        user=authenticate(username=username, password=password)
        login(self.request, user)

        return validation

现在我没有类似的下一个'参数与内置登录/注销视图中的相同。那么如何在注册后将新用户重定向到上一页?

我尝试了以下方法:

步骤1: 从将触发我的注册视图的模板中,传递下一个'参数通过GET方法。

<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a>

顺便说一下,与注册相关的网址是:

#accounts/urls.py

urlpatterns = patterns('',
    # Others
    url(r'^registration/$', views.Registration.as_view(), name='registration'),
)

步骤2: 覆盖get_context_data()和get_success_url()方法,尝试构建我自己的&#39; next&#39;参数:

#views.py

    class Registration(CreateView):

        # other codes as above

        def get_context_data(self, **kwargs):
              context=super(Registration, self).get_context_data(**kwargs)
              context[next]=self.request.GET['next']
              return context

        def get_success_url(self):
              redirect_to=self.request.POST['next']
              return redirect_to

步骤3: 在我的模板中,添加一个隐藏的&#39;输入字段以保存下一个值:

# accounts/registration.html

<form method="post" action="{% url 'accounts:registration' %}" > {% csrf_token %}
    <p>
    {{form.as_p}}
    </p>
    <input type="submit" value="Regsitarte" /> 
    <input type="hidden" name="next" value={{next}} /> 
</form>

此方法仅在用户在注册过程中没有出错时才能正常工作。例如,如果用户POST了一个已存在的用户名,或者该电子邮件地址的格式无效,则此方法将报告有关&#34; next&#34;参数。

任何人都可以在注册后提供重定向用户的方法吗?或者您可以更改我的代码以实现此功能吗?我想使用Django的内置基于类的通用视图,而不是从头开始编写新视图。

1 个答案:

答案 0 :(得分:1)

如果您将HTML表单action属性留空,则默认为当前页面的网址, GET查询参数和所有

如果您更改表单以删除隐藏字段并删除操作,它应该可以正常工作:

<form method="post">
    <p>
    {{form.as_p}}
    </p>
    <input type="submit" value="Regsitarte" /> 
</form>