我正在尝试创建一个系统,除非请求来自特定位置,否则无法访问某些页面。我目前已经完成所有工作,除非在检查位置并将请求重定向到下一个视图后,下一个视图上的表单未正确发布。它仍在尝试发布位置数据表单。
你会在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'),
)
答案 0 :(得分:0)
您需要重定向,而不仅仅是调用视图。
if good_location(user_lat,user_lon):
return redirect('add')
答案 1 :(得分:0)
好的!经过大量的文档搜索和谷歌搜索后,我发现了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()视图中呈现页面之前位置是正确的。然后我就可以使用常规重定向功能了,因为我可以在urls.py中找到一个针对add()的网址,而无需人们绕过位置检查。