Django 在“model.save()”之后不更新 HTML 模板
Posted
技术标签:
【中文标题】Django 在“model.save()”之后不更新 HTML 模板【英文标题】:Django doesn't update HTML template after `model.save()` 【发布时间】:2019-07-20 04:21:37 【问题描述】:我有一个使用 Django REST 框架的 Django 应用程序。当我进行更改模型字段的 Ajax 调用时:
# Delete media
def delete(self, request, pk, format=None):
media = get_object_or_404(Media, pk=pk)
media.deleted = True
media.save()
return Response(status=status.HTTP_200_OK)
然后触发一个 javascript location.reload();
,重新加载的页面仍然包含“已删除”模型。在数据库中,deleted
字段为 True,而在我的模板中,我这样做了:
% for media in issue.getMedia %
% if not media.deleted %
% include 'core2/include/media.html' %
% endif %
% endfor %
当我重新加载 Django 网络服务器时,它不再显示 media.deleted
对象。
已编辑
Ajax 请求是:
controller: function ($scope)
$scope.execute = function(url)
console.log($scope.action)
$.ajax(
url: $scope.action,
type: 'DELETE',
success: function(result)
location.reload();
,
error: function(e)
alert("Error deleting")
console.log(e)
);
当我使用常规 Django 表单修改对象时(例如创建对象时),页面会正确重新加载。
第 2 版
issue.getMedia
在问题模型上的实现:
def getMedia(self):
return Media.objects.filter(issue=self).order_by('creationDate')
【问题讨论】:
你确定重新加载有效吗? 有什么想法吗?也许是因为我没有更新序列化程序...? 我们需要检查 ajax 调用是否有效。我怀疑数据库中的字段状态没有改变。出租没有问题。你可以调用delete API,然后检查数据库中deleted的值吗? @sun_jara 正确更改数据库上的字段。所以,我按下按钮进行 ajax 调用,我在后端和数据库上调试调用(一切正常),然后我重新加载前端页面,也清理缓存,但没有成功。只有当我重新启动 django 框架时,它才会正确重新加载模型 明白。您能否分享issue.getMedia
的实现以及设置问题上下文变量值的get_context() 方法。另外,您是否在任何地方使用 prefetch_related ?
【参考方案1】:
尝试将“never_cache”装饰器添加到负责页面渲染的视图中:
from django.views.decorators.cache import never_cache
@never_cache
def myview(request, ...):
...
如果是 CBV,则发送到调度方法:
class MyView(View):
@never_cache
def dispatch(self,request,*args,**kwargs):
return super().dispatch(request,*args,**kwargs)
【讨论】:
有效!您能解释一下禁用缓存的后果吗?页面渲染速度变慢? 使用“never_cache”装饰器,你指示浏览器不要缓存页面,所以当用户需要它时,他的浏览器会依次访问服务器(顺便说一下,这正是你的想要在你的用例中)。这增加了多少延迟取决于重建特定页面所需的工作。在有证据表明太多用户需要同一页面之前,我不会对动态站点中的缓存过于痴迷。在这种情况下,我会考虑将缓存作为减少服务器资源使用的一种措施——但在此之前我会尝试优化页面呈现。 说了这么多,恐怕用户会注意到页面重新加载;正如您已经体验过的那样,缓存在这里不是一个选项,但是您有更多可用的解决方案。例如,您可以完全避免页面重新加载,而是使用 DOM 操作从现有页面中删除已删除的项目。这可以通过从 ajax 调用成功返回来安全地触发,这表明该对象已在服务器上被删除。【参考方案2】:您可以尝试使用location.reload(true)
。也许它需要现金。
【讨论】:
@selan - 我仍然认为,问题在于重新加载。I clean also the cache manually for each reload
是什么意思?
mm.. 我意识到,如果我在私人窗口上打开页面,模型会出现更新,而不是在旧窗口 (firefox) 上仍然出现旧窗口。我使用 firefox,重新加载我使用应该清除缓存的 CTRL shift+R 的内容。此外,我在开发人员工具 > 网络上有 disable cache
选项。以上是关于Django 在“model.save()”之后不更新 HTML 模板的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3 - 在model.save之后修改其他模型的属性
Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据
在 model.save 或 model.save 中捕获数据库异常!方法?