Post 在 Django 中重定向后方法不起作用

Post method not working after redirect in Django

我正在尝试创建一个系统,除非请求来自特定位置,否则无法访问某些页面。我目前一切正常,除了在检查位置并将请求重定向到下一个视图后,下一个视图上的表单不正确 posting。它仍在尝试 post 位置数据表单。

你会在我的 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')

因此,如果 good_location 为真,我将尝试重定向到 add() 视图。它重定向正确,但是当用户尝试 post 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'),
)

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

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

好的!经过大量文档搜索和谷歌搜索后,我发现了 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 中将 url 指向 add() 而无需人们绕过位置检查。