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

