Django中基于模型ratings字段值自定义次数循环的实现
解决Django模板中根据评分循环显示星级的问题
你之前的写法错误在于Django模板标签({% %})内部不能嵌套变量插值语法({{ }}),模板引擎无法正确解析这种嵌套结构。下面提供两种可行的实现方式:
方案1:在模型中添加辅助方法
直接修改models.py,给Testimonials类新增一个返回评分对应范围的方法,让模板可以直接调用:
class Testimonials(models.Model): photo = models.ImageField(upload_to="testimonials_photo/", null=True, verbose_name='Client Photo', blank=True) ratings = models.IntegerField(verbose_name="rating") pt_messsage = models.TextField(verbose_name="Message") pt_name = models.CharField(verbose_name="Patient Name", max_length=200) client_profession = models.CharField(verbose_name="Patient Profession", max_length=200, blank=True) def rating_range(self): # 返回对应评分次数的范围对象,供模板循环使用 return range(self.ratings) def __str__(self): return self.pt_name
模板中调用这个方法即可实现循环:
<div> {% for _ in testimonial.rating_range %} <span class="fa fa-star checked"></span> {% endfor %} </div>
方案2:使用自定义模板过滤器(可选)
如果不想修改模型结构,可以通过自定义模板过滤器实现:
- 在你的app目录下创建
templatetags文件夹(若不存在),并在其中新建__init__.py和custom_filters.py文件 - 在
custom_filters.py中编写过滤器逻辑:
from django import template register = template.Library() @register.filter def rating_range(value): return range(value)
- 在使用该过滤器的模板顶部加载它:
{% load custom_filters %}
- 最后在模板中通过过滤器生成循环范围:
<div> {% for _ in testimonial.ratings|rating_range %} <span class="fa fa-star checked"></span> {% endfor %} </div>
内容的提问来源于stack exchange,提问作者Jayant Nigam
相关产品推荐
相关产品推荐

