Django 使用绑定表单重定向到另一个视图

Posted

技术标签:

【中文标题】Django 使用绑定表单重定向到另一个视图【英文标题】:Django redirecting to another view with a bound form 【发布时间】:2012-02-10 11:07:42 【问题描述】:

我正在使用Python 2.7Django 1.3.1

我正在尝试实现可以​​从任意页面调用并重定向到同一页面而无需任何代码重复的登录功能。我目前的方式是我有两个视图:一个用于主页,一个用于登录。我希望能够使用 绑定表单从 sign_in 视图重定向到主页视图。主要问题是当用户输入不正确的数据(例如错误的密码)时,我想重定向到同一页面但想发送原始表单的上下文。我希望能够在不显式调用视图函数的情况下执行此操作,因为我希望能够从任意页面执行此操作。我该怎么做呢?我当前的尝试总是返回一个未绑定的表单,以防数据无效。

我当前的代码是(简化的):

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】:

没有反向。反向为您提供路径 /my-homepage/

django 的范例是使用隐藏的“next”变量设置到初始页面。

#In your template
<input type="hidden" value=" request.path " name="next" />

然后,成功返回一个 HttpResponseRedirect 到下一个:

     if login_form.is_valid():
         # login user 
         return HttpResponseRedirect(form.cleaned_data['next'])

这是持久的,因为如果出现问题,您会在 /account/login/ 页面上显示一个带有错误的表单,其中隐藏了 next 变量,并且用户仍然可以回到原来的位置。

【讨论】:

这只是在成功后重定向到原始页面。当 login_form 无效时,我很担心。我想重定向到与原始页面对应的视图(是的,可以通过'next'参数获得指向该页面的链接),绑定表单指示错误。 这可能很可爱,但也可能是一场灾难。如果出现错误,您不希望用户在单个页面上明确地专注于修复错误吗? 是的。这是一种可行的解决方案,但缺点是用户被重定向到看起来不同的页面。我想知道是否可以对同一页面进行失败的重定向。似乎答案是否定的? 如果您真的想要“同一页面”错误,请使用降级为在其自己的页面上显示错误的 ajax 系统。 ***.com/questions/312925/…

以上是关于Django 使用绑定表单重定向到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

django 重定向到另一个带有上下文的视图

在 Django 1.6 中使用另一个 url slug 从视图重定向到另一个 html 页面

Django之重定向

Django 唯一 URL 重定向问题

重定向到视图时的 Django NoReverseMatch

django 重定向到查看