如何解决如何在 django-import-export 上传期间捕获字段实例
我想将数据导入我的资源中减去学校字段,因为登录用户已经属于特定学校。如果我的 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,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','stream')
解决方法
从您的“字段”声明中删除“学校”,或将其添加到“排除”列表中。
编辑
要包含与登录用户关联的 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。