【问题标题】:Add extra value from ImportForm to model instance before imported or saved在导入或保存之前从 ImportForm 向模型实例添加额外的值
【发布时间】:2022-01-22 19:46:52
【问题描述】:

我要导入以下模型:

class Token(models.Model):
    key = models.CharField(db_index=True,unique=True,primary_key=True,    )
    pool = models.ForeignKey(Pool, on_delete=models.CASCADE)
    state = models.PositiveSmallIntegerField(default=State.VALID, choices=State.choices) 

然后是资源模型:

class TokenResource(resources.ModelResource):
class Meta:
    model = Token
    import_id_fields = ("key",)

以及用于查询池的 ImportForm:

class AccessTokenImportForm(ImportForm):
pool = forms.ModelChoiceField(queryset=Pool.objects.all(), required=True)

应该为所有导入的令牌对象设置此值。 问题是,我还没有找到实现这一点的方法。

如何从表单获取值到实例?

before_save_instance 或类似方法我无法再访问这些值。我想我必须早点通过这个。有人做过类似的事情吗?

感谢和问候 马特

【问题讨论】:

    标签: django django-import-export


    【解决方案1】:

    看来您可以在 Admin 中传递额外的值:

    class TokenAdmin(ImportMixin, admin.ModelAdmin):
    
    def get_import_data_kwargs(self, request, *args, **kwargs):
        form = kwargs.get('form')
        if form:
            kwargs.pop('form')
    
            if 'pool' in form.cleaned_data:
                return {'pool_id' : form.cleaned_data['pool'].id }
    
            return kwargs
        return {}
    

    然后在你的资源中使用这个数据 after_import_instance 方法来设置这个值

    def after_import_instance(self, instance, new, row_number=None, **kwargs):
        pool_id = kwargs.get('pool_id')
        instance.pool_id = pool_id
        instance.created_at = timezone.now()
    

    那么缺少字段(非空)的错误就消失了。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2018-03-21
      • 1970-01-01
      • 2018-07-03
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      相关资源
      最近更新 更多