3

私の基本的な目標は、( を使用してModelForm) 既存のデータベース オブジェクトからのデータが事前に入力されたフォームを作成し、ユーザーがそれらのデータを変更できるようにしてから、送信されたフォームを新しいオブジェクトとして保存することです。(「コピー」してから「変更を加えて貼り付ける」セットアップのようなものです。) これは、ファイル フィールドと ClearableFileInput ウィジェットを除いて正常に機能します。

thisthis、およびthisなどの質問に対する回答から、ファイル フィールドに初期値を入力することはできませんし、入力するべきではないことも明らかです。

ただし、ClearableFileInputウィジェットに関する Django ドキュメントには次のように記載されています。

ファイルアップロード入力:フィールドが必須ではなく、初期データ<input type='file' ...>がある場合、フィールドの値をクリアするための追加のチェックボックス入力があります。

(すでに少し混乱していますが、Djangoは初期値を持つモデル<input type='file' ...>フィールドを参照していると思いますが、フィールドはまだ空白ですか?)

したがって、この方法のいずれかを使用する場合:

>>> obj = Foo.objects.get(pk=1)
>>> obj.fooFile.name
u'files/foo1.txt'
>>> f = FooForm(instance=obj)

またはこの方法:

f = FooForm(initial={'fooFile':Foo.objects.get(pk=1).fooFile})

フォームをインスタンス化するために、ClearableFileInput ウィジェットが表示されます。

現在、チェックボックスをオフにして、変更... 入力 http://phagesdb.org/static/formDisplay.png

ただし、ユーザーがこのフィールドを変更せずにフォームを送信すると、「Currently」行の値が Django に完全に失われたように見えます。request.POSTまたはのどちらにもないようform.cleaned_dataです。バインドした ModelFormを呼び出す.is_valid()と、新しいオブジェクトでファイル フィールドが空白になります。.save()

そう:

  1. ClearableFileInput ウィジェットは「現在」の値を渡しますか? そうでない場合、ClearableFileInput ウィジェットは誤解を招きやすく、使用が非常に限られているのではないですか? 「変更...」入力を使用しない限り、返される値は「現在...」の値になると思います。

  2. を呼び出したときに新しいオブジェクトに表示されるように、その値をキャプチャするにはどうすればよい.save()ですか? f = FooForm(request.POST, request.FILES, instance=obj)(変更されたオブジェクトではなく、新しいオブジェクトが必要なため、使用できないことを思い出してください。)

4

1 に答える 1

0

フォームに非表示のフィールドを配置し、最初に渡した画像へのパスを事前に入力します。次に、次のようなsaveメソッドを記述します。

これは、ファイルフィールドが事前入力されているかのようにユーザーに表示され、ファイルを新しいインスタンスに保存して、クリアチェックボックスを使用できるようにするか、独自の画像をアップロードできるようにします。

from django.core.files.base import ContentFile
def save(self, commit=True):
    insance = super(FormClass, self).save(False)
    if not instance.file_field and self.cleaned_data['file_field_path'] and not self.data.get('file_field-clear'):
        path = os.path.join(settings.MEDIA_ROOT, self.cleaned_data['file_field_path'])
        with open(path) as f:
            file_object = ContentFile(f.read())
            instance.file_field.save(self.cleaned_data['file_field_path'], file_object, False)

    if commit:
        insance.save()
    return insance
于 2012-12-04T22:07:59.357 に答える