【问题标题】:How to capture a field instance during django-import-export upload如何在 django-import-export 上传期间捕获字段实例
【发布时间】:2021-05-14 13:26:49
【问题描述】:

我想将数据导入我的资源中减去学校字段,因为登录的用户已经属于特定学校。如果我的 excel 中没有 school 字段,我该怎么做???

class uploadStudents(LoginRequiredMixin,View):
    context = {}
    def get(self,request):
        form = UploadStudentsForm()
        self.context['form'] = form
        return render(request,'upload.html',self.context)

    def post(self, request):
        form = UploadStudentsForm(request.POST , request.FILES)
        data_set = Dataset()
        if form.is_valid():
            file = request.FILES['file']
            extension = file.name.split(".")[-1].lower()
            resource = ImportStudentsResource()
            if extension == 'csv':
                data = data_set.load(file.read().decode('utf-8'), format=extension)
            else:
                data = data_set.load(file.read(), format=extension)
            result = resource.import_data(data_set, dry_run=True, collect_failed_rows=True, raise_errors=True)
            if result.has_validation_errors() or result.has_errors():
                messages.success(request,f'Errors experienced during import.')
                print("error", result.invalid_rows)
                self.context['result'] = result
                return redirect('import_students')                
            else:
                result = resource.import_data(data_set, dry_run=False, raise_errors=False)
                self.context['result'] = None
                messages.success(request,f'Students uploaded successfully.')                
        else:
            self.context['form'] = UploadStudentsForm()

        return render(request, 'upload.html', self.context)

资源

class ImportStudentsResource(resources.ModelResource):
    school = fields.Field(attribute = 'school',column_name='school', widget=ForeignKeyWidget(School, 'name'))
    klass = fields.Field(attribute = 'klass',column_name='class', widget=ForeignKeyWidget(Klass, 'name'))
    stream = fields.Field(attribute = 'stream',column_name='stream', widget=ForeignKeyWidget(Stream, 'name'))
    class Meta:
        model = Student
        fields = ('school','student_id','name','year','klass','stream')
        import_id_fields = ('student_id',)
        import_order = ('school','student_id','name','year','klass','stream')

【问题讨论】:

    标签: python-3.x django django-views django-import-export


    【解决方案1】:

    从您的“字段”声明中删除“学校”,或将其添加到“排除”列表中。

    docs

    编辑

    要包含与登录用户关联的school_id,您需要使用此school_id 创建资源:

    资源
    class ImportStudentsResource(resources.ModelResource):
    
        def __init__(self, school_id):
            super().__init__()
            self.school_id = school_id
    
        def before_save_instance(self, instance, using_transactions, dry_run):
            instance.school_id = self.school_id
    
    邮政()
    def post(self, request):
        # skipped existing code
        school_id = get_school_id_from_logged_in_user(self.request)
        resource = ImportStudentsResource(school_id)
    

    【讨论】:

    • 非常感谢@Matthew Hegarty
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2015-05-08
    • 2021-12-13
    • 2021-03-07
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多