【问题标题】:Is it possible to parse excel files in the forms.py?是否可以解析f​​orms.py中的excel文件?
【发布时间】:2015-02-15 09:31:30
【问题描述】:

我正在尝试验证 forms.py 中上传的 excel 文件。这甚至可能吗?

我收到此错误消息“强制转换为 Unicode:需要字符串或缓冲区,找到无类型”

forms.py

from .parse_excel import *

class FileSurveyForm(forms.ModelForm):
    file  = forms.FileField()

    ....

    def clean_file(self):

        data_file = self.cleaned_data.get('file')

        data = parse_file(data_file.read())

        netmaskRegex = '^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$'

        for order in data:
            if re.match(netmaskRegex, order['netmask']) is not None:
                raise ValidationError("Invalid netmask!")

        return file

parse_excel.py

import xlrd 

def parse_file(datafile):
    workbook = xlrd.open_workbook(file_contents=datafile)
    sheet = workbook.sheet_by_index(0)

    START_ROW = 35
    END_ROW   = 60

    myList = []

    for row in range(START_ROW,END_ROW):

        values = (sheet.row_values(row, start_colx=1, end_colx=20))

        headers = ["controller", "hostname", "domain", "ip_address", "netmask", "gateway", "dns1", "dns2", "ntp1", "ntp2", 
                   "order_name", "order_phone", "order_email", 
                   "shipping_adress", "shipping_city", "shipping_region", "shipping_region_code", "shipping_country", "shipping_diff"]

        dictionary = dict(zip(headers, values))

        myList.append(dictionary)

    return myList

添加了堆栈跟踪:

Environment:


Request Method: POST
Request URL: http://10.21.145.103:8000/cooking/survey/file_upload/

Django Version: 1.6.6
Python Version: 2.6.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.formtools',
 'contact',
 'cooking')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.6/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/home/jeremy.kwong/mysite/cooking/views.py" in post
  101.         if (form.is_valid() and ingredient_form.is_valid()):
File "/usr/lib/python2.6/site-packages/django/forms/forms.py" in is_valid
  129.         return self.is_bound and not bool(self.errors)
File "/usr/lib/python2.6/site-packages/django/forms/forms.py" in errors
  121.             self.full_clean()
File "/usr/lib/python2.6/site-packages/django/forms/forms.py" in full_clean
  273.         self._clean_fields()
File "/usr/lib/python2.6/site-packages/django/forms/forms.py" in _clean_fields
  291.                     value = getattr(self, 'clean_%s' % name)()
File "/home/jeremy.kwong/mysite/cooking/forms.py" in clean_file
  226.         data = parse_file(data_file.read())
File "/home/jeremy.kwong/mysite/cooking/parse_excel.py" in parse_file
  4.     workbook = xlrd.open_workbook(file_contents=datafile)
File "/usr/lib/python2.6/site-packages/xlrd/__init__.py" in open_workbook
  394.         f = open(filename, "rb")

Exception Type: TypeError at /cooking/survey/file_upload/
Exception Value: coercing to Unicode: need string or buffer, NoneType found

【问题讨论】:

  • 为什么不可能?但是你没有给我们任何关于错误的上下文,即完整的回溯,所以我们无法判断它为什么会发生。
  • 我使用相同的代码读取并保存在我的 views.py 文件中。但是,相同的代码在我的 forms.py 中不起作用。我在某处读到 forms.py 可能会以不同的方式处理“文件”。
  • 另外,我已经添加了堆栈跟踪。

标签: django forms validation django-forms


【解决方案1】:

出现此错误是因为xlrd.open_workbook()file_contents 参数为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多