如何使用django视图上传所有行



我在这里发布了这个问题,并得到了一个建议。我设法完成了它,但无法在导入部分实现它[我管理导出]。因此,我再次提出这个问题。我可以有一种方法循环浏览上传文件中的所有行并上传所有数据吗。目前它只上传一个项目,一行。

def UploadTeachersView(request):
message=''
if request.method == 'POST':
form = NewTeachersForm(request.POST, request.FILES)
if form.is_valid():
excel_file = request.FILES['file']
fd, path = tempfile.mkstemp()
try:
with os.fdopen(fd, 'wb') as tmp:
tmp.write(excel_file.read())
book = xlrd.open_workbook(path)
sheet = book.sheet_by_index(0)
obj=TeacherData(
school_id = sheet.cell_value(rowx=1, colx=1),
code = sheet.cell_value(rowx=1, colx=2),
first_name = sheet.cell_value(rowx=1, colx=3),
last_name = sheet.cell_value(rowx=1, colx=4),
email = sheet.cell_value(rowx=1, colx=5),
phone = sheet.cell_value(rowx=1, colx=6),
)
obj.save()
finally:
os.remove(path)
else:
message='Invalid Entries'
else:
form = NewTeachersForm()
return render(request,'upload_teacher.html', {'form':form,'message':message})

我能够用Vinaykumarmaurya 的一个例子来实现这一点

这是的视图

class UploadTeachersView(View):
context = {}
def get(self,request):
form = NewTeachersForm()
self.context['form'] = form
return render(request,'upload_teacher.html',self.context)
def post(self, request):
form = NewTeachersForm(request.POST , request.FILES)
data_set = Dataset()
if form.is_valid():
file = request.FILES['file']
extension = file.name.split(".")[-1].lower()
resource = ImportTeachersResource()
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,)
print(result)
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('upload_teachers')

else:
result = resource.import_data(data_set, dry_run=False, raise_errors=False)
self.context['result'] = None
messages.success(request,f'Teachers uploaded successfully.')
#return redirect('teachers')

else:
#print(self.context['form'])
self.context['form'] = NewTeachersForm()
return render(request, 'upload_teacher.html', self.context)

资源.py

class ImportTeachersResource(resources.ModelResource):
school = fields.Field(column_name='school', attribute='school', widget=ForeignKeyWidget(School, 'name'),
saves_null_values=False)

class Meta:
model = TeacherData
fields = ('code','school', 'first_name', 'last_name', 'email', 'phone')
import_id_fields = ('code',)
import_order = ('school','code','first_name','last_name','email','phone')
clean_model_instances = True

Forms.py

class NewTeachersForm(forms.Form):
file = forms.FileField(allow_empty_file=False,validators=[FileExtensionValidator(allowed_extensions=['csv', 'xls', 'xlsx'])], 
label="",help_text = 'Format ==> code | first_name | last_name | email | phone.')

html。

<div class="container">
{% if form %}
<form method="post" enctype="multipart/form-data" >

<div class="bg-white p-2">
{% csrf_token %}
{% for field in form %}

{%if field.field.widget.input_type == 'file'%}
<div class="form-group mb-0 files">
{{ field|as_crispy_field }}
</div>
{% else %}
{{ field }}
{% endif %}
{% endfor %}
{% for message in messages %}
<h5 class="text-success">{{ message }}</h5>
{% endfor %}
</div>
<input type="submit" class="btn btn-outline-primary" value="Save">
<a href="{% url 'teachers' %}" class="btn btn-outline-primary text-right">Back</a>
</form>
{%endif%}
</div>

谢谢大家。

最新更新