Я не мог найти это в документах, но думаю, что это должно быть возможно. Я говорю конкретно о визу 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 }}
, похоже, не работает. Следующее, что приходит мне в голову, - написать собственный виджет. Это будет работать именно против моих усилий по удалению как можно большего количества настраиваемого кода.
Любые идеи, что было бы самым простым в этом сценарии?