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

时间:2012-01-14 18:11:21

标签: python django django-forms django-views django-1.3

我正在使用Python 2.7Django 1.3.1

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

我目前的代码是(simplfied):

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 个答案:

答案 0 :(得分:2)

不反向。反向获取路径/ my-homepage /

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

#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 /页面上显示一个带有隐藏的下一个变量的错误表单,并且用户仍然会回到原来的位置。