如何在Django的choices中获取分组名称?
获取Django嵌套Choices的分组名称
针对你用嵌套元组组织的MEDIA_CHOICES,可以通过遍历choices结构、匹配选中值的方式获取对应的分组名称,以下是具体实现方案:
方法一:模型内添加实例方法
直接在Student模型中定义方法,用于返回当前实例的media分组:
from django.db import models class Student(models.Model): MEDIA_CHOICES = [ ('Audio', ( ('vinyl', 'Vinyl'), ('cd', 'CD'), ) ), ('Video', ( ('vhs', 'VHS Tape'), ('dvd', 'DVD'), ) ), ('unknown', 'Unknown'), ] media = models.CharField(max_length=20, choices=MEDIA_CHOICES) def get_media_group(self): # 遍历所有choices项 for item in self.MEDIA_CHOICES: # 判断当前项是否为分组(子元素是列表/元组) if isinstance(item[1], (list, tuple)): group_name, options = item # 遍历分组内的选项 for opt_value, _ in options: if opt_value == self.media: return group_name else: # 处理无分组的选项(如unknown) opt_value, _ = item if opt_value == self.media: return None # 也可返回对应的标签'Unknown',按需调整 # 未匹配到的情况返回None return None
在Admin界面展示分组名称
如果需要在Admin后台显示分组名,只需在StudentAdmin中配置list_display:
from django.contrib import admin from .models import Student class StudentAdmin(admin.ModelAdmin): list_display = ('media', 'get_media_group') # 给列设置友好显示名称 get_media_group.short_description = '媒体分组' admin.site.register(Student, StudentAdmin)
方法二:独立工具函数(复用场景)
如果需要在多个业务场景中复用该逻辑,可以抽成独立函数:
def get_media_group(value): from .models import Student for item in Student.MEDIA_CHOICES: if isinstance(item[1], (list, tuple)): group_name, options = item for opt_val, _ in options: if opt_val == value: return group_name else: opt_val, _ = item if opt_val == value: return None return None
使用时直接调用:get_media_group('vinyl') 会返回'Audio'。
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

