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

Django实现用户已评分判断:展示非可编辑星级替代表单

解决已评分用户显示星级而非表单的问题

步骤1:修改视图,传递当前用户的评分记录到模板

在TheirDetailView的get_context_data方法中,新增逻辑获取当前登录用户对当前List的评分记录,传给模板做判断:

class TheirDetailView(DetailView):
    model = List
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 获取当前页面的List对象
        current_list = self.get_object()
        # 初始化用户评分记录为None
        user_starr = None
        # 仅当用户登录时,查询该用户对当前List的评分
        if self.request.user.is_authenticated:
            user_starr = Starr.objects.filter(user=self.request.user, list=current_list).first()
        
        # 保留原有获取评论和所有评分的逻辑
        modell = Review.objects.all()
        starr = Starr.objects.all()
        
        context["user_starr"] = user_starr
        context["starr"] = starr
        context["modam"] = modell
        return context

步骤2:修改list_detail.html,根据评分状态切换显示内容

在list_detail.html中,替换原来直接引入create_starr.html的代码,改成条件判断逻辑:

{% if user.is_authenticated %}
    {% if user_starr %}
        <!-- 用户已评分,展示已评星级 -->
        <div class="starr_cont">
            <p>你的评分:</p>
            <div class="comment-stars">
                <span class="stars-post-comments">
                    {% for star_num in "12345" %}
                        {% if star_num|add:0 <= user_starr.rate %}
                            <span class="fa fa-star checked"></span>
                        {% else %}
                            <span class="fa fa-star"></span>
                        {% endif %}
                    {% endfor %}
                </span>
                <span>{{ user_starr.rate }}星</span>
            </div>
        </div>
    {% else %}
        <!-- 用户未评分,展示评分表单 -->
        {% include 'app/create_starr.html' %}
    {% endif %}
{% else %}
    <!-- 用户未登录,提示登录后评分 -->
    <p>请<a href="{% url 'login' %}">登录</a>后进行评分</p>
{% endif %}

步骤3:优化create_starr.html的表单(可选但更安全)

原表单的用户和List下拉框容易被篡改,改成隐藏字段自动填充信息:

<div class="starr_cont">
<form class="starr" method="POST" action="{% url 'app:create_starr' %}">
    {% csrf_token %}
    <!-- 隐藏字段:自动填充当前用户ID -->
    <input type="hidden" name="user" value="{{ user.pk }}">
    <!-- 隐藏字段:自动填充当前List ID -->
    <input type="hidden" name="list" value="{{ list.pk }}">
    
    <div class="comment-stars">
        <span class="stars-post-comments">
            <span class="fa fa-star" id="st1"></span>
            <span class="fa fa-star" id="st2"></span>
            <span class="fa fa-star" id="st3"></span>
            <span class="fa fa-star" id="st4"></span>
            <span class="fa fa-star" id="st5"></span>
        </span>
    </div>
    <p>
        <input type="number" name="rate" value="0" min="1" max="5" required="" id="id_rate" placeholder="1-5星">
    </p>
    <div><button type="submit">提交评分</button></div>
</form>
</div>

补充样式(让选中的星星变黄色)

在你的CSS文件中添加以下样式,让已选中的星星显示黄色:

.fa-star.checked {
    color: #ffc107;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12