在 Django 中注册后重定向到上一页
Redirect to previous page after registration in Django
对于登录和注销,我在 django.contrib.auth.views 中使用 Django 的内置视图。将用户重定向到上一页非常容易,因为您可以将 'next' 参数传递给 login/logout 视图。他们工作得很好。
当我想实现类似的注册功能时,出现了一些问题。似乎 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
现在我没有与内置 login/logout 视图中类似的 'next' 参数。那么如何在注册后将新用户重定向到上一页?
我尝试了以下方法:
第一步:
从将触发我的注册视图的模板中,通过 GET 方法传递一个 'next' 参数。
<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a>
对了,与注册相关的url是:
#accounts/urls.py
urlpatterns = patterns('',
# Others
url(r'^registration/$', views.Registration.as_view(), name='registration'),
)
第二步:
覆盖 get_context_data() 和 get_success_url() 方法,尝试构造我自己的 'next' 参数:
#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
第三步:
在我的模板中,添加一个 'hidden' 输入字段来保存下一个值:
# 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 的用户名已经存在,或者电子邮件地址的格式无效,则此方法将报告有关 "next" 参数的错误。
任何人都可以提供一种在注册后重定向用户的方法吗?或者你能改变我的代码来实现这个功能吗?我想使用 Django 内置的基于 Class 的通用视图,而不是从头开始编写新视图。
如果您将 HTML 表单 action
属性留空,它默认为当前页面的 URL、GET
查询参数和所有.
如果您更改表单以删除隐藏字段并删除操作,它应该可以正常工作:
<form method="post">
<p>
{{form.as_p}}
</p>
<input type="submit" value="Regsitarte" />
</form>
对于登录和注销,我在 django.contrib.auth.views 中使用 Django 的内置视图。将用户重定向到上一页非常容易,因为您可以将 'next' 参数传递给 login/logout 视图。他们工作得很好。
当我想实现类似的注册功能时,出现了一些问题。似乎 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
现在我没有与内置 login/logout 视图中类似的 'next' 参数。那么如何在注册后将新用户重定向到上一页?
我尝试了以下方法:
第一步: 从将触发我的注册视图的模板中,通过 GET 方法传递一个 'next' 参数。
<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a>
对了,与注册相关的url是:
#accounts/urls.py
urlpatterns = patterns('',
# Others
url(r'^registration/$', views.Registration.as_view(), name='registration'),
)
第二步: 覆盖 get_context_data() 和 get_success_url() 方法,尝试构造我自己的 'next' 参数:
#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
第三步: 在我的模板中,添加一个 'hidden' 输入字段来保存下一个值:
# 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 的用户名已经存在,或者电子邮件地址的格式无效,则此方法将报告有关 "next" 参数的错误。
任何人都可以提供一种在注册后重定向用户的方法吗?或者你能改变我的代码来实现这个功能吗?我想使用 Django 内置的基于 Class 的通用视图,而不是从头开始编写新视图。
如果您将 HTML 表单 action
属性留空,它默认为当前页面的 URL、GET
查询参数和所有.
如果您更改表单以删除隐藏字段并删除操作,它应该可以正常工作:
<form method="post">
<p>
{{form.as_p}}
</p>
<input type="submit" value="Regsitarte" />
</form>