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 模板的主要内容,如果未能解决你的问题,请参考以下文章

Django model.save() 不写入数据库

Rails 3 - 在model.save之后修改其他模型的属性

Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据

在 model.save 或 model.save 中捕获数据库异常!方法?

Keras model.save() 和 model.save_weights() 的区别?

骨干同步发送 CORS 预检,但之后啥也不做