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

Django优化:根据数据库对象状态返回类属性的更优实现

最优实现方案:在模型层封装状态样式逻辑

把状态对应的badge样式逻辑封装到Application模型中是最合理的做法,既符合Django的MVT设计思想,又能让模板代码更简洁,还能在其他地方复用这个逻辑。

步骤1:修改模型,添加属性方法

在Application模型文件(如application/models.py)中,添加带@property装饰器的方法,返回对应状态的badge类名:

from django.db import models

class Application(models.Model):
    # 你的模型原有字段
    username = models.CharField(max_length=100)
    desired_username = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    application_status_id = models.IntegerField()
    application_status = models.CharField(max_length=50)

    @property
    def badge_class(self):
        # 状态ID与样式类的映射表
        status_class_map = {
            1: 'bg-secondary',
            2: 'bg-success',
            # 可扩展添加更多状态的映射
        }
        # 无匹配ID时返回默认类
        return status_class_map.get(self.application_status_id, 'bg-secondary')

步骤2:简化模板代码

修改application_list.html,直接调用模型的badge_class属性,移除所有条件判断:

<tbody>
    {% for app in applications %}
    <tr>
      <th style="text-align: left;"><a href="{{ app.get_absolute_url }}">{{ app.username }}</a></th>
      <td>{{ app.desired_username }}</td>
      <td>{{ app.created }}</td>
      <td><span class="badge {{ app.badge_class }}">{{ app.application_status }}</span></td>
    </tr>
    {% endfor %}
</tbody>

关于视图层处理的说明

如果一定要在视图层处理,需要循环查询结果给每个对象添加属性,但这种方式代码冗余且复用性差:

def application_list(request):
    template = 'application/application_list.html'
    applications = Application.objects.all()
    
    status_class_map = {1: 'bg-secondary', 2: 'bg-success'}
    for app in applications:
        app.badge_class = status_class_map.get(app.application_status_id, 'bg-secondary')
    
    context = {
        'applications': applications,
    }
    
    return render(request, template, context)

对比来看,模型层的方案更优雅、更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:15:29