Django重定向到另一个视图并带有绑定表单

0 投票
1 回答
2652 浏览
提问于 2025-04-17 10:15

我正在使用 Python 2.7Django 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 变量,用户仍然可以回到他们之前所在的地方。

撰写回答