2012-08-17 57 views
1

目前我正在嘗試在我的管理界面中進行多上傳。 我使用Luril Garmash在他的博客中提供的代碼: http://garmoncheg.blogspot.de/2011/07/django-creating-multi-upload-form.html 他用了很不錯的jQuery插件從塞巴斯蒂安Tschan多文件上傳: http://blueimp.github.com/jQuery-File-Upload/ 我也是Django管理界面多上傳圖片並將它們與相冊相關

好了,這裏是我的結構:

models.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) 

我延長了change_form.html模板畫冊,以示對光度計的添加/修改網站上的jQuery的多上傳表單皮脂模型。

這裏的視圖邏輯:

views.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') 

調用此方法用於由插件上載的每一個文件。 注意:通過單擊「開始上傳」,文件上傳將文件從照片集分開保存到文件系統和數據庫。

注意:我的photoalbum添加/更改模板顯示頂部帶有「添加文件」和「開始上傳」的photoalbumimage的multiuploader,底部使用標準django管理保存鈕釦。 sry,我無法提供圖片,因爲我的連接非常非常慢(太慢)在我現在的地方。

這就是我的問題開始:文件被保存,但照片集沒有。我需要一種保存方式將相冊的正確主鍵保存爲每個保存的文件作爲外鍵。 我的第一個想法是在會話中處理這個問題,將所有保存的文件ID保存到列表中,並在相冊的post_save信號中,獲取這些ID並將正確的photoalbum ID保存到這些文件中。但我不認爲應該在模型中訪問會話。我的第二個想法是創建一個臨時模型,例如上傳的照片,我存儲所有的文件ID和PostSave信號的照片,獲取這些ID的。

這只是感覺不對。 我認爲完成我的需求最安全的方法是上傳相冊創建後的文件(點擊保存在相冊模型中)。然後,相冊的主鍵將存在,我可以將其保存到每個文件。 但我沒有任何想法得到這個工作。

非常感謝您的幫助提前。 問候

+0

爲什麼不只是使用內聯模型管理員?您可以根據需要上傳任意數量的圖像,並且會自動將您的模型關聯起來。您還可以使用django-admin-sortable將它們拖放到可排序模式,該模式適用於內聯模型:http://pypi.python.org/pypi/django-admin-sortable/ – Brandon 2012-08-17 13:53:01

+0

上傳至少20張圖片對於每個相冊,因此我需要多選 編輯:這就是爲什麼我不使用內置的文件格式。我不知道如何將自定義多選插件與內聯功能相結合 – saschor 2012-08-17 14:00:10

+0

我沒有看到如何使用內聯與此插件應該做的有什麼不同。通過ajax電話或普通郵件上傳20張圖片需要花費相同的時間。如果你使用內聯,你現在就完成了。 – Brandon 2012-08-17 14:06:12

回答

0

好吧,我達到了我的要求,通過在照片集模型中填充隱藏的表單字段,上傳和保存的照片ID。這個字段是一個charfield,我把所有的id放在裏面,用「//」分隔它們,並將它解析爲照片集的post_save信號。

+0

我的頁面只顯示這個東西「只有郵政接受」 – vkrams 2012-09-22 13:57:12

+0

是的,那麼你必須做一個POST請求或刪除if語句,你將請求方法限制爲POST – saschor 2012-12-14 09:16:31