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

Python Django中重定向后Post方法不起作用,python,django,redirect,view,location,Python,Django,Redirect,View,Location,我正在尝试创建一个系统,其中某些页面无法访问,除非请求来自特定位置。我目前所有的东西都在工作,除了在检查了位置并且请求被重定向到下一个视图之后,下一个视图上的表单没有正确发布。它仍在尝试发布位置数据表单 您将在我的视图中看到我的更多含义。py: def add(request): if request.method == 'POST': form = StudentModelForm(request.POST) if form.is_valid():

我正在尝试创建一个系统,其中某些页面无法访问,除非请求来自特定位置。我目前所有的东西都在工作,除了在检查了位置并且请求被重定向到下一个视图之后,下一个视图上的表单没有正确发布。它仍在尝试发布位置数据表单

您将在我的
视图中看到我的更多含义。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\u location
为真,我将尝试重定向到
add()
视图。它会正确重定向,但当用户试图在
add.html
django上发布表单时,django认为它再次在
location\u check\u add
中提交表单

编辑:添加
url.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')

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

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

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

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

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()视图中呈现页面之前位置正确。然后我就可以使用常规的重定向功能,因为我可以在url.py中将一个url指向add(),而不需要人们绕过位置检查。

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

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

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()视图中呈现页面之前位置正确。然后我可以使用常规重定向功能,因为我可以在url.py中将url定向到add(),而不需要人们绕过位置检查。

现在我有了它,这样我的网站com/add url就可以定向到app.views.location\u check\u add。所以当我尝试“return redirect('add')时,它会将我带回位置检查页面。我现在使用这种方式,因此有人无法在浏览器中键入website.com/add,直接跳到“add.html”“没有位置检查。有没有更好的方法来设置这个?我将把我的url.py添加到原始问题中以供参考,而不是调用users.views.location\u check\u add以获取url add/您可以只有一个视图,在该视图中,您首先检查位置的有效性,然后显示内容(如果有效),否则不显示内容或将其重定向到其他错误页或其他内容@所以我尝试了你的建议,因为在这种情况下,这似乎是最好的办法。但是我仍然会遇到同样的错误,第一篇文章(在本例中是坐标表单)不断被提交,即使它应该是add()表单。我想这是因为第一个request.POST被转发到下一个视图,而不是像正确重定向那样的全新请求。哦,不要从视图中调用另一个视图!!如果您使用的是javascript ajax post,那么应该手动检测重定向并手动更改window.location。不是重定向到添加视图,而是呈现添加表单!!现在我有了它,所以我的网站.com/add url指向app.views.location\u check\u add。所以当我尝试“return redirect('add')时,它会将我带回位置检查页面。我现在使用这种方式,因此有人无法在浏览器中键入website.com/add,直接跳到“add.html”“没有位置检查。有没有更好的方法来设置这个?我将把我的url.py添加到原始问题中以供参考,而不是调用users.views.location\u check\u add以获取url add/您可以只有一个视图,在该视图中,您首先检查位置的有效性,然后显示内容(如果有效),否则不显示内容或将其重定向到其他错误页或其他内容@所以我尝试了你的建议,因为在这种情况下,这似乎是最好的办法。但是我仍然会遇到同样的错误,第一篇文章(在本例中是坐标表单)不断被提交,即使它应该是add()表单。我想这是因为第一个request.POST被转发到下一个视图,而不是像正确重定向那样的全新请求。哦,不要从视图中调用另一个视图!!如果您使用的是javascript ajax post,那么应该手动检测重定向并手动更改window.location。不是重定向到添加视图,而是呈现添加表单!!