让我这样说:
model.py:
class Task(models.Model):
...
seq_file = models.FileField(upload_to='files/', blank=True, null=True)
...
ajax.py (我使用的是dajaxice,但这并不重要):
...
def startTask(request, name):
task = Task.objects.get(task_name=name)
data = task.seq_file.open()
filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
if not os.path.isfile(filename):
raise Exception, "file " + filename + " not found."
sequences = parser.parse(data.read())
...
这将返回:
File "/home/mnowotka/Dokumenty/MgrFuncAdnot/app/django-gui/src/gui/ajax.py", line 43, in startTask
sequences = parser.parse(data.read())
AttributeError: 'NoneType' object has no attribute 'read'
但是:
...
def startTask(request, name):
task = Task.objects.get(task_name=name)
filename = os.path.join(settings.MEDIA_ROOT ,task.seq_file.name)
if not os.path.isfile(filename):
raise Exception, "file " + filename + " not found."
data = open(filename)
sequences = parser.parse(data.read())
...
完美的工作!为什么?
(我使用的是django 1.3)
发布于 2012-02-24 06:09:16
因为models.FileField的open方法不返回任何内容
您可以只使用:
task.seq_file.read()
而且你不需要计算文件的路径来检查文件是否存在。您可以使用task.seq_file.path:
if not os.path.isfile(task.seq_file.path):
....
发布于 2012-02-24 05:57:50
FileField
将为您提供一个类似文件的对象,不需要对其调用open()。在您的示例中,只需调用task.seq_file.file
。
为什么会这样呢?FileField
有许多存储后端,并且其中许多后端没有磁盘中的文件支持(例如,请考虑S3存储)。我猜这就是为什么文档说它返回一个类似文件的对象,而不是一个文件。对于某些类型的存储,"open“方法毫无意义。
发布于 2013-12-18 04:04:33
如果有疑问,请检查代码。以下是django.db.models.fields.files
的摘录
def open(self, mode='rb'):
self._require_file()
self.file.open(mode)
# open() doesn't alter the file's contents, but it does reset the pointer
open.alters_data = True
因此,在FileField
的情况下,open
使用指定的模式重新打开文件。然后,一旦调用了open
,就可以通过新应用的模式继续使用像read
这样的方法。
https://stackoverflow.com/questions/9421797
复制相似问题