目前我正在尝试在我的管理界面中进行多重上传。我正在使用 Luril Garmash 在他的博客中提供的代码:http://garmoncheg.blogspot.de/2011/07/django-creating-multi-upload-form.html 他 正在使用非常好的 jQuery 插件从多个上传文件Sebastian Tschan: http ://blueimp.github.com/jQuery-File-Upload/ 我也是。
好的,这是我的结构:
模型.py:
class Photoalbum(models.Model):
event = models.OneToOneField(Event, help_text="Liste der Events ohne Fotoalbum")
date = models.DateField(auto_now=True)
facebook = models.BooleanField()
class PhotoalbumImage(models.Model):
album = models.ForeignKey(Photoalbum, related_name='images', null=True)
filename = models.CharField(max_length=60, blank=True, null=True, editable=False)
image = models.FileField(upload_to=storage, editable=False)
key_data = models.CharField(max_length=90, unique=True, blank=True, null=True, editable=False)
upload_date = models.DateTimeField(auto_now=True)
我扩展了 Photoalbum 的 change_form.html 模板,以便在 Photoalbum 模型的添加/更改站点上显示 jQuery 多上传表单。
这是视图逻辑:
视图.py:
def multiuploader(request):
#getting file data for farther manipulations
file = request.FILES[u'files[]']
wrapped_file = UploadedFile(file)
filename = wrapped_file.name
file_size = wrapped_file.file.size
log.info ('Got file: "%s"' % str(filename))
#writing file manually into model
#because we don't need form of any type.
image = PhotoalbumImage()
image.filename=str(filename)
image.image=file
image.key_data = image.key_generate
image.save()
log.info('File saving done')
#getting thumbnail url using sorl-thumbnail
im = get_thumbnail(image, "80x80", quality=50)
thumb_url = im.url
#settings imports
try:
file_delete_url = settings.MULTI_FILE_DELETE_URL+'/'
file_url = settings.MULTI_IMAGE_URL+'/'+image.key_data+'/'
except AttributeError:
file_delete_url = 'multi_delete/'
file_url = 'multi_image/'+image.key_data+'/'
#generating json response array
result = []
result.append({"id":image.id,
"name":filename,
"size":file_size,
"url":file_url,
"thumbnail_url":thumb_url,
"delete_url":file_delete_url+str(image.pk)+'/',
"delete_type":"POST",})
response_data = json.dumps(result)
#checking for json data type
#big thanks to Guy Shapiro
if "application/json" in request.META['HTTP_ACCEPT_ENCODING']:
mimetype = 'application/json'
else:
mimetype = 'text/plain'
return HttpResponse(response_data, mimetype=mimetype)
else: #GET
return HttpResponse('Only POST accepted')
插件上传的每个文件都会调用此方法。注意:文件上传通过单击“开始上传”将文件与相册分开保存到文件系统和数据库。
注意:我的相册添加/更改模板在顶部显示我的相册图像的多重上传器,带有“添加文件”和“开始上传”,在底部显示相册的表单字段,底部带有标准 django 管理保存按钮。抱歉,我无法提供图片,因为在我现在所在的地方,我的连接非常非常慢(太慢了)。
这就是我的问题开始的重点:文件已保存,但相册没有。我需要一种保存方法将相册的正确主键作为外键保存到每个保存的文件中。我的第一个想法是处理会话的这个问题,将所有保存的文件 ID 保存到一个列表中,并在相册的 post_save 信号中,获取这些 ID 并将正确的相册 ID 保存到这些文件中。但我认为不应访问模型中的会话。我的第二个想法是创建一个临时模型,例如 UploadedPhotos,我在其中存储所有文件 ID,并在相册的 post_save 信号上获取这些 ID。
这只是感觉不对。我认为满足我需求的最安全方法是在创建相册后上传文件(在相册模型中单击保存后)。然后相册的主键将存在,我可以将其保存到每个文件中。但我没有任何想法让这个工作。
非常感谢您提前提供的帮助。问候