【问题标题】:Django redirect page does not update the viewDjango 重定向页面不更新视图
【发布时间】:2014-06-28 05:36:51
【问题描述】:

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

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

“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)

弗朗西斯科

【问题讨论】:

  • 请包含提交表单的模板,如果它是通过 ajax 发布的,请包含该 javascript,以及处理请求的视图。
  • 查看关于一致性的文章:googlecloudplatform.blogspot.nl/2013/12/…
  • 如果刷新页面,它会更新吗?如果是这样,我怀疑这是一个一致性问题。您可能需要使用一些 ajax 来显示更新。或者,某种形式的“感谢您发帖。点击此处查看更新。”

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


【解决方案1】:

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

  • 点击右上角的菜单图标
  • 点击“工具”
  • 点击“开发者工具”
  • 点击屏幕底部打开的内容中的“网络”。

现在,对于浏览器发送的每个请求和接收到的每个响应,网络选项卡中都会有一个新条目。如果单击请求,您可以看到发送和接收的数据。如果您需要查看跨不同页面的请求,您可能需要选中“保留日志”框。

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

如果事实证明您遇到了数据存储一致性问题,那么发生的情况是数据正在被存储,但对该数据的下一个请求可能仍会获取旧数据。为了确保不会发生这种情况,您需要所谓的“强一致性”。

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

【讨论】:

  • 这正是我出来的地方。由于 GAE 数据存储,这是一个强一致性问题,因为所有 HTTP 请求都是正确的。我想出了一个解决方法,保存会话中最后插入的值(在内存缓存中它也不起作用,为什么?),进入渲染视图过程。但肯定需要检查这些问题,是的,我认为我可以更改代码中的某些内容,通过键而不是过滤来检索实体。
猜你喜欢
  • 2013-08-27
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2021-07-18
  • 2019-03-09
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多