2017-01-13 111 views
0

我使用Django构建网站,我想创建一个功能,用户通过Excel工作表可以上传信息并填充数据库。所以我安装Django的Excel的包,并按照例如:使用django-excel通过Excel工作表上传数据

settings.py

FILE_UPLOAD_HANDLERS = ("django_excel.ExcelMemoryFileUploadHandler", 
        "django_excel.TemporaryExcelFileUploadHandler") 

urls.py

url(r'^import_sheet/', views.import_sheet, name="import_sheet"), 

views.py

class UploadFileForm(forms.Form): 
    file = forms.FileField() 

def upload(request): 
if request.method == "POST": 
    form = UploadFileForm(request.POST, request.FILES) 
    if form.is_valid(): 
     filehandle = request.FILES['file'] 
     return excel._make_response(filehandle.get_sheet(),"xslx",file_name="download") 
    else: 
     form = UploadFileForm() 
     return render(request,'upload_form.html',{ 
      'form': form, 
      'title': 'Excel file upload', 
      'header': 'Please choose a valid excel file' 
     }) 

def import_sheet(request): 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, 
          request.FILES) 
     if form.is_valid(): 
      request.FILES['file'].save_to_database(
       model= quote_input, 
       mapdict= ["value_date", "value", "type", 'name']) 
      return HttpResponse("OK") 
     else: 
      return HttpResponseBadRequest() 
    else: 
     form = UploadFileForm() 
    return render(
     request, 
     'upload_form.html', 
     {'form': form}) 

models.py

class quote_input(models.Model): 
    value_date = models.DateField() 
    value  = models.FloatField() 
    type  = models.TextField(max_length=254) 
    name  = models.TextField(max_length=254) 
    # link 
    fund   = models.ForeignKey(Fund) 
    benchmark  = models.ForeignKey(Benchmark) 
    factor   = models.ForeignKey(Factors) 
    stress_factor = models.ForeignKey(Stress_Factors) 

当我上传一个基本的Excel工作表试试这个代码: enter image description here

我得到了一个OK(HttpResponse对象),但是当我看着数据库,我有没有上传。

有人有同样的问题吗?或者可以提供另一个我可以使用的例子?另一种方法?

另一个问题:在django-excel文档中,有一个关于函数“choice_func”的引用,它被定义为自定义格式化函数。任何人都可以提供有关此功能的更多信息

+0

有许多的缩进问题与您的代码。请修复它们,以便我们可以帮助您。 – 2ps

+0

另外,你的'quote_input'类在哪里? – 2ps

+0

我对缩进问题表示歉意。 –

回答

1

下面是我的代码版本,我使用了xlrd库。

import re 
import xlrd 

from agencies.models import Invite 
from extras.permissions import send_mail_wrapper 
from sms.sms_api import send_sms 


def handle_uploaded_file(request, f): 
    book = xlrd.open_workbook(file_contents=f.read()) 
    for sheet in book.sheets(): 
     number_of_rows = sheet.nrows 
     number_of_columns = sheet.ncols 

     for row in range(1, number_of_rows): 

      first_name = (sheet.cell(row, 0).value) 
      last_name = (sheet.cell(row, 1).value) 
      email = (sheet.cell(row, 2).value) 

      phone_cell = (sheet.cell(row, 3).value) 
      if phone_cell: 
       phone = re.sub("[^0-9]", "", str(phone_cell)) 
      else: 
       phone = "" 
      gender = (sheet.cell(row, 4).value).upper() 

      if email != "": 
       invite, created = Invite.objects.get_or_create(agency=request.user.agency, email=email) 

       if email and created: 
        send_sms(phone) 
        send_mail_wrapper(
         "You \'ve been invited", 'email/invite_email.html', 
         {}, [email], from_email='Casey <[email protected]>') 

和视图:

class StudentBulkAddView(ListView): 
    model = Student 
    template_name = 'student_add.html' 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(DashboardStudentBulkAddView, self).dispatch(*args, **kwargs) 

    def post(self, request): 
     if self.request.user.is_authenticated: 
      try: 
       handle_uploaded_file(request, request.FILES['student_file']) 
       success = True 

而且模板:

   <form action="{% url 'students:student_dashboard_bulk_invite' %}" method="POST" 
         enctype="multipart/form-data"> 
        <div class="form-settings notes-form"> 
         {% csrf_token %} 
         {{ upload_form }} 
         <button id="invite-tutor-btn" class="btn btn-primary margin-top" 
           data-loading-text="Loading..." type="submit">Save 
         </button> 
        </div> 
       </form> 
+0

嗨古斯塔沃,谢谢你分享你的代码。有什么我不明白的,你能解释你的代码吗?非常感谢提前 –

+0

当然,让我知道。 –

+1

嗨古斯塔沃,@method_decorator的目的是什么?和DashboardStudentBulkAddView?看起来你只有一张桌子:学生。你的代码的哪部分上传到你的表中?如果你已经管理了几个通过外键链接的表。你会将什么添加到你的代码?你如何为特定的学生推送数据?我的意思是,在您看来,您有一个检查用户的条件,但我不明白如何填写特定用户的数据库? (用户和学生之间的外键?)非常感谢您的帮助。 –

2

我认为,所有你需要做的是这样的:

def upload(request): 
    form = None 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      filehandle = request.FILES['file'] 
      # call import_sheet to import the sheet into your database 
      return import_sheet(request) 
    form = form or UploadFileForm() 
    return render(request,'upload_form.html',{ 
     'form': form, 
     'title': 'Excel file upload', 
     'header': 'Please choose a valid excel file' 
    }) 
相关问题