如何管理带有django视图的所有行? [英] How would I manage to upload al the rows with the django view?

查看:51
本文介绍了如何管理带有django视图的所有行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发布了这个问题

I posted this question here and got a suggestion. I managed to go through it but wasn't able to implement it for the import part[I managed export]. I'm therefore back with the question. Could I have a way to loop through all the rows in the uploaded file and have all the data uploaded. Currently it uploads only one item, one row.

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})

推荐答案

我能够通过示例这是视图

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)

resource.py

The resource.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>

谢谢.

这篇关于如何管理带有django视图的所有行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆