Django中如何按条件查询外键并给premium付费资源添加专属标识
实现方案说明
这里提供两种可行实现思路,优先推荐第一种方案,灵活度更高,后台配置更方便。
方案1:给包分类加付费标识字段(推荐)
方案优势
不需要硬编码属性,后续要修改某个分类的付费/免费属性,直接在Django后台操作即可,不需要改动代码。
修改步骤
- 修改
models.py中的Package_Category模型,新增布尔类型的付费标识字段
修改完成后执行class Package_Category(models.Model): title = models.CharField(max_length=10000, verbose_name="Title") slug = models.SlugField(max_length=1000, unique=True) # 新增字段,默认分类为免费包 is_premium = models.BooleanField(default=False, verbose_name="是否为付费包") def get_absolute_url(self): return reverse("package-categories", args=[self.slug]) def __str__(self): return self.title class Meta: verbose_name = "Package Category" verbose_name_plural = "Package Categories"python manage.py makemigrations和python manage.py migrate生成数据库迁移,之后去后台把需要标记为付费的分类的is_premium勾选上即可。 - 修复
index.html模板的判断逻辑
原模板直接调用package_category.premium是错误的,没有单独传入该变量,需要从vector的关联属性获取:<div class="_io980 item_image_urip"> {% if vector.package_category.is_premium %} <!-- 可替换为你需要的星标样式,不需要展示免费标识可以删掉else分支 --> <span class="premium-tag">⭐ Premium 付费包</span> {% endif %} <h4 class="_95lp"><a href="#" class="_50gt">{{vector.package_category}}</a></h4> <span class="_ip76n">{{vector.category}}</span> </div> - 若需要单独筛选所有付费包,修改
views.py的查询逻辑即可:def index(request): # 加过滤条件只查询付费包 vectors = Vectors.objects.filter(status='published', package_category__is_premium=True).order_by('-created') context = { 'vectors': vectors, } return render(request, 'index.html', context)
方案2:使用元组CHOICE实现
如果后续可能扩展多个付费等级(比如限时免费、SVIP专属等),可以用该方案:
- 修改
models.py,新增类型选项并更新模型PACKAGE_TYPE_CHOICE = ( ('free', '免费包'), ('premium', '付费包'), ) class Package_Category(models.Model): title = models.CharField(max_length=10000, verbose_name="Title") slug = models.SlugField(max_length=1000, unique=True) package_type = models.CharField(choices=PACKAGE_TYPE_CHOICE, default='free', max_length=20, verbose_name="包类型") # 其余代码不变 - 模板判断逻辑对应修改为:
需要筛选付费包时,视图过滤条件改为{% if vector.package_category.package_type == 'premium' %} <span class="premium-tag">⭐ Premium 付费包</span> {% endif %}package_category__package_type='premium'即可。
内容的提问来源于stack exchange,提问作者Destiny Franks
相关产品推荐
相关产品推荐

