如何将Django Admin中Timetable模型的day字段改为预填充下拉框
解决方案
Django原生支持将CharField渲染为下拉选择框,你可以通过以下两种方式实现需求:
方案1:修改模型定义(全项目生效,推荐)
直接在Timetable模型中为day字段添加choices参数,Django会自动在所有表单场景(包括Admin后台)将该字段渲染为下拉选择框,同时自带选项合法性校验,该修改不涉及数据库结构变更,无需执行迁移命令。
修改后的模型代码如下:
class Timetable(models.Model): # 定义星期可选值,元组第一个元素为存入数据库的值,第二个为前端显示值 DAY_CHOICES = ( ('Monday', 'Monday'), ('Tuesday', 'Tuesday'), ('Wednesday', 'Wednesday'), ('Thursday', 'Thursday'), ) gym_class = models.ForeignKey('GymClass', on_delete=models.CASCADE) start_date = models.DateField() end_date = models.DateField() # 新增choices参数 day = models.CharField(max_length=12, choices=DAY_CHOICES) time_slot = models.CharField(max_length=12) trainer = models.ForeignKey('Trainer', on_delete=models.CASCADE) def __str__(self): return self.gym_class.name
方案2:仅修改Admin后台配置(不改动模型,仅Admin生效)
如果你不需要在项目其他地方限制day字段的可选值,仅需要在Admin后台显示下拉框,可以直接修改admin.py的注册逻辑,自定义Timetable的Admin配置类:
修改后的admin.py代码如下:
from django.contrib import admin from .models import GymClass, Category, Trainer, Timetable class TimetableAdmin(admin.ModelAdmin): DAY_CHOICES = ( ('Monday', 'Monday'), ('Tuesday', 'Tuesday'), ('Wednesday', 'Wednesday'), ('Thursday', 'Thursday'), ) def formfield_for_dbfield(self, db_field, request, **kwargs): if db_field.name == "day": kwargs["choices"] = self.DAY_CHOICES return super().formfield_for_dbfield(db_field, request, **kwargs) admin.site.register(GymClass) admin.site.register(Category) admin.site.register(Trainer) # 绑定自定义Admin类 admin.site.register(Timetable, TimetableAdmin)
内容的提问来源于stack exchange,提问作者Keith Power
相关产品推荐
相关产品推荐

