【问题标题】:Post method not working after redirect in Django在 Django 中重定向后发布方法不起作用
【发布时间】:2016-01-10 09:24:24
【问题描述】:

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

你会在我的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() 视图。它正确重定向,但是当用户尝试在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'),
)

【问题讨论】:

    标签: python django redirect view location


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 现在我拥有它,以便我的 website.com/add url 指向 app.views.location_check_add。因此,当我尝试“return redirect('add')”时,它让我回到了位置检查页面。我现在就是这样,所以有人不能在浏览器中键入 website.com/add 并向右跳到“add. html" 没有位置检查。有没有更好的方法来设置它?我会将我的 urls.py 添加到原始问题以供参考
      • 而不是为 url add/ 调用 users.views.location_check_add 您可以只拥有一个视图,在该视图中您首先检查位置的有效性,然后在有效时显示内容,否则不显示内容或将它们重定向到另一个错误页面或其他内容!
      • @ManjunathSatyamurthy 所以我尝试了你的建议,因为在这种情况下这似乎是最好的方法。但是我仍然遇到相同的错误,即第一个 POST(在本例中为坐标表单)不断提交,即使它应该是 add() 表单。我认为这是因为第一个 request.POST 被转发到下一个视图,而不是像正确重定向那样的全新请求。
      • 哦,不要从视图中调用另一个视图!如果您使用的是 javascript ajax post,那么您应该手动检测重定向并手动更改 window.location。而不是重定向到添加视图,呈现添加表单!
      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 2013-11-26
      • 2021-12-31
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2014-11-22
      相关资源
      最近更新 更多