在Django中重定向后,Post方法无法正常工作

时间:2015-10-12 19:38:37

标签: python django redirect view location

我正在尝试创建一个系统,除非请求来自特定位置,否则无法访问某些页面。我目前已经完成所有工作,除非在检查位置并将请求重定向到下一个视图后,下一个视图上的表单未正确发布。它仍在尝试发布位置数据表单。

你会在views.py中看到我的意思:

def add(request):
    if request.method == 'POST':
        form = StudentModelForm(request.POST)
        if form.is_valid():
           form.save()
           return HttpResponseRedirect('/')
    else:
        form = StudentModelForm()
    context_data = {'form': form}
    return render(request, 'add.html', context_data)


def location_check_add(request):
    if request.method == 'POST' and 'lat' in request.POST:
        user_lat = request.POST.get('lat')
        user_lon = request.POST.get('lon')
        if good_location(user_lat,user_lon):
            return add(request)
        else:
            return render(request, 'location.html')
    return render(request, 'checking.html')

如果add()为真,我正在尝试重定向到good_location视图。它正确地重定向,但是当用户试图在add.html上发布表单时,django认为它再次在location_check_add中提交表单。

修改:添加urls.py以供参考

import users.views

urlpatterns = patterns('',
    url(r'^$', users.views.index, name = 'index'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^add/', users.views.location_check_add, name = 'add'),
)

2 个答案:

答案 0 :(得分:0)

您需要重定向,而不仅仅是调用视图。

    if good_location(user_lat,user_lon):
        return redirect('add')

答案 1 :(得分:0)

好的!经过大量的文档搜索和谷歌搜索后,我发现了Django的会话功能。文档:

Documentation

最后,我的代码最终看起来像:

def add(request):
    if request.session.get('at_work', False):
        if request.method == 'POST':
            form = StudentModelForm(request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/')
        else:
            form = StudentModelForm()
        context_data = {'form': form}
        return render(request, 'add.html', context_data)
    else:
        return redirect(location_check_add)

def location_check_add(request):
    if request.method == 'POST' and 'lat' in request.POST:
        user_lat = request.POST.get('lat')
        user_lon = request.POST.get('lon')
        if good_location(user_lat,user_lon):
            request.session['at_work'] = True
            return redirect(add)
        else:
            return render(request, 'location.html')
    return render (request, 'checking.html')

基本上我只是传递了会话变量“at_work”,以确保在add()视图中呈现页面之前位置是正确的。然后我就可以使用常规重定向功能了,因为我可以在urls.py中找到一个针对add()的网址,而无需人们绕过位置检查。