ドキュメントでこれを見つけることができませんでしたが、それは可能であるに違いないと思います。特にClearableFileInputウィジェットについて話しています。django 1.2.6のプロジェクトから、私はこのフォームを持っています:
# the profile picture upload form
class ProfileImageUploadForm(forms.ModelForm):
"""
simple form for uploading an image. only a filefield is provided
"""
delete = forms.BooleanField(required=False,widget=forms.CheckboxInput())
def save(self):
# some stuff here to check if "delete" is checked
# and then delete the file
# 8 lines
def is_valid(self):
# some more stuff here to make the form valid
# allthough the file input field is empty
# another 8 lines
class Meta:
model = SocialUserProfile
fields = ('image',)
次に、このテンプレートコードを使用してレンダリングしました。
<form action="/profile/edit/" method="post" enctype="multipart/form-data">
Delete your image:
<label> {{ upload_form.delete }} Ok, delete </label>
<button name="delete_image" type="submit" value="Save">Delete Image</button>
Or upload a new image:
{{ upload_form.image }}
<button name="upload_image" type="submit" value="Save">Start Upload</button>
{% csrf_token %}
</form>
Django 1.3.1はデフォルトのウィジェットとしてClearableFileInputを使用するようになったため、form.saveの16行をスキップして、次のようにフォームコードを短縮できると確信しています。
# the profile picture upload form
class ProfileImageUploadForm(forms.ModelForm):
"""
simple form for uploading an image. only a filefield is provided
"""
class Meta:
model = SocialUserProfile
fields = ('image',)
それは私があまりカスタマイズされていないフォームコードを持っていて、Djangoビルトインに頼ることができるという良い感じを私に与えるでしょう。
もちろん、html出力を以前と同じに保ちたいと思います。既存のテンプレートコードだけを使用すると、「Currently:somefilename.png」のようなものが不要な場所にポップアップ表示されます。
フォームフィールドをさらに分割すると、うまく{{ upload_form.image.file }}
いかないようです。次に頭に浮かぶのは、カスタムウィジェットを作成することでした。これは、カスタマイズされたコードをできるだけ多く削除するという私の努力に正反対に機能します。
このシナリオで行う最も簡単なことは何ですか?