Django Admin TabularInline调用关联模型字段报错求助
解决Django Admin Inline展示关联模型字段的报错问题
你在基于中间模型Contactgroup实现Contact与Groupe的多对多关联后,在Groupe的Admin表单中用TabularInline展示Contactgroup数据时,试图在fields列表中直接添加id_contact__e_mail来显示关联Contact的邮箱,触发了Unknown field(s) (id_contact__e_mail) specified for Contactgroup错误。
原因很直接:Django Admin的fields参数仅支持当前模型(这里是Contactgroup)的直接字段,跨关联模型的双下划线字段不能直接放在fields里。下面给两种可行的解决办法:
方案1:只读展示关联邮箱(最常用)
如果只是需要展示Contact的邮箱,不需要编辑,把关联字段放到readonly_fields中即可:
方式A:自定义方法(可自定义显示标题)
class MyContactgroupInline(admin.TabularInline): model = Contactgroup fields = ['id', 'id_contact'] readonly_fields = ['contact_email'] def contact_email(self, obj): return obj.id_contact.e_mail contact_email.short_description = '联系人邮箱' # 自定义显示的列标题
方式B:直接用跨关系字段(简洁)
class MyContactgroupInline(admin.TabularInline): model = Contactgroup fields = ['id', 'id_contact'] readonly_fields = ['id_contact__e_mail']
这种方式的显示标题默认是Id contact e mail,如果需要优化标题,还是推荐用方式A。
方案2:Inline中直接编辑关联邮箱
如果需要在Inline里直接修改Contact的邮箱,就得自定义表单来处理关联字段的读写:
from django import forms class ContactgroupInlineForm(forms.ModelForm): contact_email = forms.CharField(label='联系人邮箱') class Meta: model = Contactgroup fields = ['id', 'id_contact', 'contact_email'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 初始化表单时,填充当前关联Contact的邮箱 if self.instance.pk and self.instance.id_contact: self.fields['contact_email'].initial = self.instance.id_contact.e_mail def save(self, commit=True): instance = super().save(commit=False) # 保存时更新关联Contact的邮箱 if commit: contact = instance.id_contact contact.e_mail = self.cleaned_data['contact_email'] contact.save() instance.save() return instance class MyContactgroupInline(admin.TabularInline): model = Contactgroup form = ContactgroupInlineForm
内容的提问来源于stack exchange,提问作者guimicmoc
相关产品推荐
相关产品推荐

