Django ModelForm下拉框如何用外键当前值初始化
在Django ModelForm中初始化外键下拉框的正确姿势
其实你完全不需要在Form字段里硬写initial值!问题的核心在于你自定义的表单字段和模型里的外键字段没有正确映射,导致ModelForm没法自动用instance里的现有值初始化下拉框。
问题根源
你的Alumno模型里,外键字段是padre_idpadre和curso_idcurso,但你在Form里用了padre和curso作为字段名——ModelForm不知道这两个字段对应模型的哪个属性,自然没法自动填充初始值。
解决方案(两种可选)
方案1:给自定义字段添加source参数
通过source指定表单字段对应的模型外键字段,这样ModelForm就能关联起来,自动用instance的现有值初始化下拉框:
class AlumnoForm(forms.ModelForm): padre = PadreModelChoiceField( queryset=Padre.objects.all(), source='padre_idpadre' # 关联模型的外键字段 ) curso = CursoModelChoiceField( queryset=Curso.objects.all(), source='curso_idcurso' ) class Meta: model = Alumno fields = ('nombre','padre','curso',) labels = { 'nombre': 'Nombre', 'padre': 'Padre', 'curso': 'Curso', }
方案2:让表单字段名和模型外键字段名一致
直接使用模型里的外键字段名作为表单字段名,然后在labels里设置友好的显示名称,这样ModelForm会自动处理初始值:
class AlumnoForm(forms.ModelForm): padre_idpadre = PadreModelChoiceField(queryset=Padre.objects.all()) curso_idcurso = CursoModelChoiceField(queryset=Curso.objects.all()) class Meta: model = Alumno fields = ('nombre','padre_idpadre','curso_idcurso',) labels = { 'nombre': 'Nombre', 'padre_idpadre': 'Padre', 'curso_idcurso': 'Curso', }
额外小提示
如果你的PadreModelChoiceField和CursoModelChoiceField没有自定义特殊逻辑(比如自定义显示文本),其实完全不需要手动定义这些字段!ModelForm会自动为外键生成对应的下拉框,并且自动处理初始值,代码可以更简洁:
class AlumnoForm(forms.ModelForm): class Meta: model = Alumno fields = ('nombre','padre_idpadre','curso_idcurso',) labels = { 'nombre': 'Nombre', 'padre_idpadre': 'Padre', 'curso_idcurso': 'Curso', }
这样修改后,你视图里的代码不需要任何改动,当你用form = AlumnoForm(instance=alumno)初始化表单时,下拉框就会自动选中当前Alumno关联的Padre和Curso了。
内容的提问来源于stack exchange,提问作者Atarx
相关产品推荐
相关产品推荐

