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。不是重定向到添加视图,而是呈现添加表单!!