我正在使用Django开发一个应用程序。我有一个表单,用户上传3个不同的文件(至少一个)。然后将这些文件发送到生成一些结果文件的主脚本。我想将所有这些文件存储在一个目录中,每个目录名称都由表单提交唯一。我在互联网上环顾四周,找到了UUID技术。我安装了名为django-uuid-upload-path的Django模块。但是当我提交我的表单时,它总是返回相同的uuid,看起来像一个UUID字符串。这是我使用这个模块的模型:
from django.db import models
from uuid_upload_path import uuid
class Analysis(models.Model):
uidDir = uuid()
dirFile = 'documents/%Y/%m/%d/' + str(uidDir)
structureFile = models.FileField(upload_to = dirFile)
我试图以这种方式使用此模块中的upload_to:
来自uuid_upload_path import upload_to class Analysis(models.Model): structureFile = models.FileFiels(upload_to = upload_to)我已经为我的3个FileFields做了这个,它在一个表单提交上给了我3个不同的UUID。现在的问题是我的文件不在同一目录中。
这是我的控制器,我上传用户提交的文件:
def analysis(request):
if request.method == 'POST':
documents = Analysis.objects.all()
form = AnalysisForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Analysis(structureFile = request.FILES['structureFile'])
newdoc.save()
我尝试过使用Python的uuid模块,但我遇到了同样的问题。我试图刷新网页并删除cookie,但没有任何效果。
P.S:我在OS X 10.9.4上使用Safari。
提前致谢
答案 0 :(得分:0)
我认为你不应该在模型部分硬编码你的UUID。 Django ORM将在创建数据库时使用它一次。
在您的模型中,您应该使用UUID保留字段,但是在上传文件时应该在views.py中生成此UUID。
所以有步骤,上传应该如何:
答案 1 :(得分:0)
来自upload_to
文档:
这也可以是可调用的,例如函数,它将被调用 获取上传路径,包括文件名。这个可赎回的必须 能够接受两个参数,并返回一个Unix风格的路径(用 正斜杠)传递给存储系统。他们俩 将传递的参数是:
您需要做的是创建此uuid函数并将其传递给upload_to
。
答案 2 :(得分:0)
我在Django的邮件列表中找到了答案。以下是获取字段值的方法:
def dir_file(analysis, file_name): # should live outside your model
return 'documents/%s/%s' % ( analysis.uuidDir, file_name)
在模型中,你输入:
uuidDir = models.CharField(max_length = 36)
structureFile = models.FileField(upload_to = dir_file)
现在我的目录是UUID并在每个表单提交时生成!