使用django-import-export自定义Admin导入时缺失字段报错
问题解决方法
1. 调整Resource类逻辑,移除CSV关联的league/season字段,添加表单参数传递处理
修改admin.py中的TeamsSeasonResource,不再从CSV读取league和season,改为接收Admin表单传递的值并赋值给导入对象:
# admin.py class TeamsSeasonResource(resources.ModelResource): ballpark = fields.Field( column_name='ballpark', attribute='ballpark', widget=ForeignKeyWidget(Ballpark, field='park_name')) team = fields.Field( column_name='team', attribute='team', widget=ForeignKeyWidget(Team, field='team_acronym')) # 新增构造函数,接收Admin表单传递的league和season参数 def __init__(self, league=None, season=None, **kwargs): super().__init__(**kwargs) self.league = league self.season = season # 导入对象时,直接给对象设置表单选中的league和season def import_obj(self, obj, data, **kwargs): super().import_obj(obj, data, **kwargs) obj.league = self.league obj.season = self.season class Meta: model = TeamsSeason import_id_fields = ('ballpark', 'team', 'season', 'league') fields = ('ballpark', 'team', 'league', 'season')
2. 在Admin类中添加表单参数传递到Resource的方法
在TeamsSeasonAdmin里新增get_resource_kwargs方法,把表单中选中的league和season传递给Resource:
class TeamsSeasonAdmin(ImportMixin, admin.ModelAdmin): list_display = ('id', 'season','team') resource_classes = [TeamsSeasonResource] import_form_class = TeamSeasonImportForm confirm_form_class = TeamSeasonConfirmImportForm def get_confirm_form_initial(self, request, import_form): initial = super().get_confirm_form_initial(request, import_form) if import_form: initial['league'] = import_form.cleaned_data['league'] initial['season'] = import_form.cleaned_data['season'] return initial # 新增:将表单选中的参数传递给Resource def get_resource_kwargs(self, request, form, *args, **kwargs): kwargs = super().get_resource_kwargs(request, form, *args, **kwargs) if form: kwargs['league'] = form.cleaned_data['league'] kwargs['season'] = form.cleaned_data['season'] return kwargs admin.site.register(TeamsSeason, TeamsSeasonAdmin)
3. 调整CSV格式
现在CSV只需包含ballpark和team两个字段,league和season的值将完全使用Admin表单中选择的内容。
原代码问题原因
- 原Resource中定义了
league和season字段并绑定CSV列,当CSV无对应列时,导入时无法赋值导致数据库league_id非空约束报错。 - 当CSV包含这两个字段时,Resource优先读取CSV值,完全忽略表单参数,因为没有逻辑将表单值映射到导入对象。
内容的提问来源于stack exchange,提问作者Dave White
相关产品推荐
相关产品推荐

