【问题标题】:Upload data via Excel sheet using django-excel使用 django-excel 通过 Excel 工作表上传数据
【发布时间】:2017-01-13 21:51:24
【问题描述】:

我使用 Django 构建了一个网站,我想创建一个功能,让用户可以通过 Excel 工作表上传信息并填充数据库。于是我安装了 django-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 表来尝试此代码时:

我得到了一个 OK (HttpResponse),但是当我查看数据库时,我什么都没有上传。

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

另一个问题:在 django-excel 文档中,有一个关于函数“choice_func”的参考,该函数被定义为自定义格式化函数。谁能提供有关此功能的更多信息?

【问题讨论】:

  • 您的代码存在许多缩进问题。请修复它们,以便我们为您提供帮助。
  • 另外,你的quote_input 班级在哪里?
  • 对于缩进问题,我深表歉意。
  • 仍然没有quote_input 类。
  • 因为我没有放正确的课。我道歉

标签: python django django-excel


【解决方案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 <success@email.com>')

还有观点:

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>

【讨论】:

  • 您好 Gustavo,感谢您分享您的代码。有些东西我不明白,你能解释一下你的代码吗?非常感谢提前
  • 好的,请告诉我。
  • 嗨 Gustavo,@method_decorator 的用途是什么?和 DashboardStudentBulkAddView?您似乎只有一张桌子:学生。你的代码的哪一部分上传到你的表中?如果您管理了由一些外键链接的多个表。你会在你的代码中添加什么?您如何为特定学生推送数据?我的意思是,在您看来,您有一个检查用户的条件,但我不明白您如何为特定用户填写数据库? (用户和学生之间的外键?)非常感谢您的帮助。
  • @method_decorator 只是验证用户是否登录的一种方式。DashboardStudentBulkAddView 是我在视图中使用的名称。在这种情况下,我实际上只使用了一个模型,这段代码的功能是为每个用户创建邀请,但是同样的方法也可以用于多个模型,你只需要创建外键模型。跨度>
  • 您好 Gustavo,非常感谢您的回答。最后两个问题:你把handle_uploaded_file放在哪里?在 view.py 中,在 forms.py 中?我看不到您在代码中保存信息的位置。您是否为此构建了特定功能?
【解决方案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'
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2019-11-18
    • 2017-03-28
    相关资源
    最近更新 更多