Django重定向页面不会更新视图

时间:2014-05-10 14:27:18

标签: django google-app-engine django-forms

我在Google App Engine上使用Django Framework。 我在同一视图上有多个表单,以提交到不同的URL。 麻烦在我提交表单后:即使被调用的方法更新了数据存储区和一些数据,也不会刷新上一页(表单放入的位置),显示更新的数据。

我可以使用jQuery或一些javascrip框架解决这个问题,附加服务器返回的dinamically内容但是,如何避免它? 建议? 我错了吗?

“secure.html”模板的一部分

<form action="/addMatch" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>


Matches:
<br />
{% for m in matches%}
    {{m.description}} ---> {{m.reward}}
{% endfor%}

“/ addMatch”网址视图:

def addMatch(request):
    form = MatchForm(request.POST)
    if form.is_valid():
        user = User.all().filter('facebookId =', int(request.session["pbusr"]))
        m = Match(user=user.get(),description =form.cleaned_data["description"],reward=form.cleaned_data["reward"])
        m.save()
        return HttpResponseRedirect("/secure/")
    else:
        logging.info("Not valid")
        return HttpResponseRedirect("/secure")

看似不起作用的视图方法:

@auth_check_is_admin
def secure(request): 
    model={}
    user = User.all().filter('facebookId =', int(request.session["pbusr"]))
    u = user.get()
    if (u.facebookFanPageId is not None and not u.facebookFanPageId == ""):
        model["fanPageName"] = u.facebookFanPageName
        model["form"] = MatchForm()
        model["matches"] = u.matches
    else:
            ....
        return render(request,"secure.html",model)

弗朗西斯

1 个答案:

答案 0 :(得分:1)

根据您发布的内容,您似乎正确地重定向并且存在数据库一致性问题。测试此方法的一种方法是查看Google Chrome开发人员工具中的网络标签:

  • 点击右上角的菜单图标
  • 点击&#34;工具&#34;
  • 点击&#34;开发人员工具&#34;
  • 点击&#34;网络&#34;在屏幕底部打开的东西。

现在,您的浏览器发送的每个请求及其收到的每个响应都会在网络选项卡中显示一个新条目。如果单击请求,则可以看到已发送和接收的数据。如果您需要在不同页面上查看请求,您可能需要检查&#34;保留日志&#34;框。

打开网络标签后,转到您的页面并提交表单。通过查看网络选项卡,您应该能够判断您的浏览器是否向同一URL发出了新的GET请求。如果对同一页面有新请求但该请求具有旧内容,则会出现数据存储一致性问题。如果没有新请求产生对页面数据的响应,那么您有重定向问题。

如果事实证明您有数据存储一致性问题,那么正在发生的是数据存储,但下一次请求该数据仍可能获得旧数据。为了确保不会发生这种情况,您需要具备强大的一致性。&#34;

在正常的App Engine项目中,您可以通过将实体放在同一个实体组中并使用祖先查询来获得强大的一致性。我不确定您为Django使用的数据库/数据存储区以及不同数据库层如何与App Engine的一致性进行交互,因此这可能是错误的,但如果您可以为您的用户提供右键然后直接从该键获取它们(而不是获取所有用户并按键过滤),您可能会获得强大的一致性。