Django UpdateView编辑页下拉框不显示原有已选月份值如何解决
解决方案
出现这个问题是多个常见配置错误叠加导致的,按以下步骤排查修正即可:
- 第一步:先修正模型choices的语法错误
你当前的choices定义用了冒号不符合Django规范,Django的choices要求每个选项为(存储值, 显示值)格式的二元元组,修正后的代码如下:
months_choice = ( ("1", "一月"), ("2", "二月"), # 剩余月份按相同格式补充即可 ) date = models.CharField( max_length=3, choices=months_choice, blank=False # 加上这个禁止字段为空,默认不会生成空选项 )
- 第二步:确认UpdateView的基础配置正确
UpdateView默认会自动绑定当前编辑的实例数据,不需要额外设置初始值,只要你正确配置了model和fields属性即可,示例配置:
from django.views.generic.edit import UpdateView from .models import 你的模型名 class 你的视图类(UpdateView): model = 你的模型名 fields = ["date", 其余要编辑的字段] success_url = "编辑成功后的跳转地址"
- 第三步:如果自定义了表单类,按以下方式配置
如果是你单独写了ModelForm类,要么给月份字段设置empty_label=None去掉空选项,要么确保渲染表单的时候没有手动覆盖value属性:
from django import forms from .models import 你的模型名 class 你的表单类(forms.ModelForm): date = forms.ChoiceField( choices=months_choice, empty_label=None, # 直接去掉下拉框的空选项 required=True ) class Meta: model = 你的模型名 fields = ["date", 其余要编辑的字段]
之后在UpdateView里指定form_class = 你的表单类即可。
- 第四步:排查自定义逻辑是否覆盖了默认初始值
如果你重写了视图的get_initial方法,一定要先调用父类的方法获取实例的原有数据,再追加自定义初始值,示例:
def get_initial(self): initial = super().get_initial() # 你要追加的其他初始值逻辑写在这里,不要直接覆盖initial return initial
按照以上步骤修正后,编辑页面的下拉框会默认加载实例创建时保存的月份值,不会再显示空选项。
内容的提问来源于stack exchange,提问作者zarooba
相关产品推荐
相关产品推荐

