You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:01:22