1

現在、管理インターフェースでマルチアップロードを機能させようとしています。私は彼のブログで提供されているコードLurilGarmashを使用しています:http://garmoncheg.blogspot.de/2011/07/django-creating-multi-upload-form.html は、 Sebastian Tschan: http ://blueimp.github.com/jQuery-File-Upload/ そうです。

さて、これが私の構造です:

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)

Photoalbumモデルの追加/変更サイトにjQueryマルチアップロードフォームを表示するために、Photoalbumのchange_form.htmlテンプレートを拡張しました。

ビューロジックは次のとおりです。

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

このメソッドは、プラグインによってアップロードされたファイルごとに呼び出されます。注:ファイルのアップロードでは、[アップロードの開始]をクリックして、フォトアルバムとは別にファイルをファイルシステムとデータベースに保存します。

注:フォトアルバムの追加/変更テンプレートでは、上部に「ファイルの追加」と「アップロードの開始」が表示され、下部に標準のdjango管理者の保存ボタンが表示されたフォトアルバムのフォームフィールドが表示されます。今いる場所では接続が非常に遅い(遅すぎる)ため、写真を提供できません。

それが私の問題の始まりでした。ファイルは保存されますが、フォトアルバムは保存されません。フォトアルバムの正しい主キーを外部キーとして保存された各ファイルに保存するための保存方法が必要です。私の最初のアイデアは、セッションでこの問題を処理し、保存されたすべてのファイルIDをリストに保存し、フォトアルバムのpost_saveシグナル内でそれらのIDを取得し、正しいフォトアルバムIDをそれらのファイルに保存することでした。しかし、モデル内のセッションにアクセスするべきではないと思います。2番目のアイデアは、一時モデルを作成することです。たとえば、UploadedPhotosでは、すべてのファイルIDを保存し、フォトアルバムのpost_saveシグナルでそれらのIDを取得します。

これは正しく感じられません。私のニーズを達成するための最も安全な方法は、フォトアルバムが作成された後(フォトアルバムモデルで[保存]をクリックした後)にファイルをアップロードすることだと思います。次に、フォトアルバムの主キーが存在し、それを各ファイルに保存できます。しかし、これを機能させるためのアイデアはありません。

よろしくお願いします。ご挨拶

4

1 に答える 1

0

フォトアルバムモデルの写真のアップロードおよび保存されたIDを非表示のフォームフィールドに入力することで、要件を達成しました。このフィールドはcharfieldであり、すべてのIDをその中に入れ、「//」で区切り、フォトアルバムのpost_saveシグナルで解析します。

于 2012-08-17T23:35:32.390 に答える