django views.py 中的保存方法在模型中覆盖后不起作用,py

Posted

技术标签:

【中文标题】django views.py 中的保存方法在模型中覆盖后不起作用,py【英文标题】:save method in django views.py not working after overriding it in models,py 【发布时间】:2021-04-27 14:35:49 【问题描述】:

这是来自 views.py 文件的我的主页功能,如果有人对我的博客文章发表评论,我正在尝试更新各个博客上的 cmets 计数。 之前一切正常,但后来我在 models.py 中添加了保存方法,从那时起,即使我从管理面板更改博客的关键字并尝试保存它,它也会保存但不更新关键字并保留前一个关键字。 [我打印了每个博客及其各自的 cmets,他们正在打印正确的结果 假设我的博客 1 有 2 个 cmets,并且有人添加了新评论,我得到了三个作为博客 1 的评论计数] 有人可以告诉我是什么问题并帮助我解决它。

 def home(request):
    all_blogs = Blog.objects.all()
    for b in all_blogs:
        comment_per_blog = Comment.objects.filter(blog=b.id, active=True).count()
        print(f"blog b.id has comment_per_blog comment")
        b.blog_comments = comment_per_blog
        b.save()

这是来自 models.py 文件的我的博客模型。

  class Blog(models.Model):
        objects = models.Manager()
        slug = models.SlugField(default="", null=True, blank=True, max_length=255)
        keywords = models.CharField(max_length=500, default="", null=True, blank=True)
        title = models.CharField(max_length=500)
        main_image = models.ImageField(upload_to='Blog', null=True, blank=True)
        category = models.ForeignKey(Category, on_delete=models.CASCADE)
        body = RichTextUploadingField(null=True, blank=True)
        tags = models.CharField(max_length=255)
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        created = models.DateTimeField(auto_now_add=True)
        likes = models.IntegerField(default=0)
        blog_comments = models.IntegerField(default=0)
        active = models.BooleanField(default=True)

        def save(self, *args, **kwargs):
            if self.slug is None:
               year = datetime.today().year
               self.slug = slugify(str(year) + '-' + str(self.category) + '-' + str(self.title))
               super(Blog, self).save(*args, **kwargs)
    
        def __str__(self):
            return self.title

我的评论类,这个类存储每个博客的 cmets。

class Comment(models.Model):
    blog = models.ForeignKey(Blog,on_delete=models.CASCADE,related_name='comments')
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(default=datetime.now())
    active = models.BooleanField(default=True)

class Meta:
    ordering = ['created_on']
    verbose_name = 'Blogs Comment'
    verbose_name_plural = 'Blogs Comment'
    
def __str__(self):
    return '  by '.format(self.body, self.name)

【问题讨论】:

if self.slug is None: 如果此条件为真,您只会调用超级保存方法。如果条件为假,则不保存它.... 那么我应该在其他部分添加什么先生?只是超级方法和 save() ?? 【参考方案1】:

self.slug有default = ""所以在save方法里面没有进入条件,所以super不起作用,我建议修改save方法:

        def save(self, *args, **kwargs):
            if self.slug is None or self.slug == "":
                year = datetime.today().year
                self.slug = slugify(str(year) + '-' + str(self.category) + '-' + str(self.title))
            super(Blog, self).save(*args, **kwargs)

【讨论】:

成功了!谢谢我不知道我是怎么犯这种错误的(感觉很尴尬*)。

以上是关于django views.py 中的保存方法在模型中覆盖后不起作用,py的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中获取模型表单的保存对象?

在Django中将计算值从视图保存到模型

Django表单数据未保存到数据库

如何将我在视图中获得的一些信息保存到模型中的一个字段中 - django

Django 的views.py 中应该在哪里导入? [复制]

Django 过滤和查询:在views.py、模板或过滤器中进行?