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