Django重定向到另一个视图并带有绑定表单
我正在使用 Python 2.7
和 Django 1.3.1
。
我想实现一个登录功能,这个功能可以从任何页面调用,并且在登录后能够返回到原来的页面,而不需要重复写代码。目前我有两种视图:一个是主页的视图,另一个是登录的视图。我希望能够从登录视图重定向到主页视图,并且带上一个绑定的表单。主要的问题是,当用户输入错误的数据(比如密码错误)时,我希望能够重定向回同一页面,但又想发送原始表单的上下文。我想做到这一点,而不需要明确调用视图函数,因为我希望能够从任何页面执行这个操作。我该怎么做呢?我现在的尝试总是返回一个未绑定的表单,如果数据无效的话。
我当前的代码是(简化版):
urls.py
urlpatterns = patterns('myapp.views',
url(r'^$', 'index', name='home'),
url(r'sign_in/^$', 'signin', name='sign_in')
)
views.py
def index(request, loginForm=LoginForm)
extra_context = dict()
extra_context['login_form'] = loginForm
return direct_to_template(request, 'home.html', extra_context=extra_context)
def signin(request)
if request.method == 'POST':
login_form = LoginForm(request.POST, request.FILES)
if login_form.is_valid():
# login user
redirect_view = reverse('home')
return redirect(redirect_view, kwargs={'loginForm': login_form})
# I also tried:
# return redirect(redirect_view, loginForm=login_form)
# what works is:
# return index(request, loginForm = login_form)
home.html
<form action="{% url sign_in %}" method="post">
{{ form.as_p }}
</form>
1 个回答
2
不是用反向查找。反向查找会给你一个路径,比如 /my-homepage/。
在 Django 中,处理这个问题的方式是使用一个隐藏的“next”变量,设置为用户最初访问的页面。
#In your template
<input type="hidden" value="{{ request.path }}" name="next" />
然后,在成功的情况下,返回一个 HttpResponseRedirect 到这个 next 路径:
if login_form.is_valid():
# login user
return HttpResponseRedirect(form.cleaned_data['next'])
这样做是可靠的,因为如果出现问题,你可以在 /account/login/ 页面上显示一个带有错误的表单,同时保留这个隐藏的 next 变量,用户仍然可以回到他们之前所在的地方。