python - 如何正确显示模板中递增的 Django 模型字段值?

标签 python django django-models django-templates django-views

我有一个帖子模型,并尝试正确实现 View 计数器,但当我尝试在模板中显示 View 计数器时,此方法在模板中无法正常工作。

    class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    title = models.CharField(max_length=160)
    slug = models.SlugField(null=True, blank=True, max_length=160)
    content = models.TextField()
    created = models.DateTimeField(default=datetime.datetime.now, blank=True)
    updated = models.DateTimeField(auto_now=True)
    photo = models.ImageField(upload_to='news/photos/', default='', blank=True)
    views = models.PositiveIntegerField(default=0)

    class Meta:
        verbose_name = 'Post'
        verbose_name_plural = 'News'
        ordering = ['id']

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        return super(Post, self).save(*args, **kwargs)

    def count_views(self):
        self.views = F('views') + 1
        self.save()


class PostDetail(DetailView):
model = Post
template_name = 'news/detail.html'

def get_context_data(self, **kwargs):
    context = super(PostDetail, self).get_context_data(**kwargs)
    self.object.count_views()
    context['latest_news'] = Post.objects.all().order_by('-created')[0:10]
    return context

<span><i class="icon-eye icons"></i> {{ post.views }}</span>

可能还有另一种方法可以解决这个问题,更正确。我可以用 .update queryset 解决这个问题吗?

最佳答案

问题是您使用 F 表达式来增加 View 计数器,但必须重新加载对象才能获取新值。您可以使用 refresh_from_db() 来实现此目的。

def count_views(self):
    self.views = F('views') + 1
    self.save()
    self.refresh_from_db()

如果不重新加载,self.views 的值将是 F() 表达式的字符串表示形式,这就是您当前在模板中看到的内容。

关于python - 如何正确显示模板中递增的 Django 模型字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50870950/

相关文章:

python - python,del或delattr哪个更好?

django - 如何在 Django 中使用 call_command() 在特定数据库上运行迁移?

python - django.db.migrations.exceptions.InconsistentMigrationHistory

django - 结合 DjangoObjectType 和 ObjectType

python - Django 1.6 : Clear data in one table

django - 有什么方法可以使Django的USStateField()没有预先选择的值?

python - 在 Django 中创建新闻文件

python - 在 Numpy 数组上计算交错/移位均值

python - 从非空 defaultdict 中选取一个随机元素

python - 在二十一点中找到多手牌的总数