You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django博客应用中无法获取并显示当前用户的文章点赞时间问题求助

解决Django中获取当前用户点赞时间的问题

嘿,我来帮你搞定这个问题~你遇到的错误'Likepost' object has no attribute 'request'是因为代码里的逻辑和语法都有问题,咱们一步步来修正:

首先看你的核心错误

你在views里写了All.request.user.date_liked,但All是Likepost的实例对象,它根本没有request属性啊!你要的点赞时间其实就是这个Likepost对象自带的date_liked字段,而且你还犯了两个语法小错误:

  • if request.user == All.by_user后面没加冒号:
  • 最后一行return render(..., context}的闭合括号用成了大括号},应该是小括号)

优化后的解决方案

1. 先优化模型(可选但推荐)

为了避免同一个用户多次点赞同一篇文章,给Likepost模型加个联合唯一约束:

class Likepost(models.Model):
    by_user = models.ForeignKey(User, on_delete=models.CASCADE)
    post_of = models.ForeignKey(Post, on_delete=models.CASCADE)
    date_liked = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 限制同一用户不能重复点赞同一篇文章
        unique_together = ('by_user', 'post_of')

2. 修正视图函数

不用遍历所有点赞记录,直接用查询过滤当前用户的点赞,效率更高:

from django.shortcuts import get_object_or_404, render

def blog_post_detail(request, post_id):
    obj = get_object_or_404(Post, pk=post_id)
    # 直接过滤当前用户对这篇文章的点赞记录,取第一条(因为有唯一约束,最多一条)
    user_like = obj.likepost_set.filter(by_user=request.user).first()
    # 提取点赞时间,如果用户没点赞就设为None
    liked_date = user_like.date_liked if user_like else None
    
    context = {
        'obj': obj,
        'liked_date': liked_date
    }
    return render(request, 'blog_post_detail.html', context)

3. 模板中显示点赞时间

在blog_post_detail.html里,根据liked_date的值来显示内容:

{% if liked_date %}
    <p>你在 {{ liked_date|date:"Y-m-d H:i:s" }} 点赞了这篇文章</p>
{% else %}
    <p>你还没点赞这篇文章哦</p>
{% endif %}

为什么这样改?

  • 直接用filter(by_user=request.user)查询比遍历所有点赞记录高效得多,尤其是当文章点赞数多的时候
  • 利用first()方法可以直接拿到当前用户的点赞记录(如果有的话),避免了循环判断的冗余
  • 修正了语法错误,同时让逻辑更清晰

内容的提问来源于stack exchange,提问作者Onsem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:53:11