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
相关产品推荐
相关产品推荐

