Я не смог найти это в документах, но думаю, что это должно быть возможно. Я говорю конкретно о виджете 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 в качестве виджета по умолчанию, я почти уверен, что могу пропустить 16 строк моего form.save и просто сократите код формы вот так:
# 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 -оставался таким же, как и раньше. Когда вы просто используете существующий код шаблона, такие вещи, как «В настоящее время :somefilename.png», появляются в местах, где они мне не нужны.
Дальнейшее разбиение поля формы, как {{ upload_form.image.file }}
, похоже, не работает. Следующим, что пришло мне в голову, было написать собственный виджет. Что будет работать точно против моих усилий по удалению как можно большего количества пользовательского кода.
Есть идеи, что было бы проще всего сделать в этом сценарии?