【发布时间】:2014-03-21 14:19:53
【问题描述】:
我发现将 ClearableFileInput 自定义为模型中包含 ImageField 的 modelForm 中的默认小部件非常困难。
特别是我不想要作为小部件一部分的删除复选框。我尝试以多种方式自定义/覆盖渲染以摆脱复选框,包括将小部件设置为 FileInput 并覆盖在 widgets.py 文件中子类化小部件的渲染方法。
我能解释的最简单的问题是这样的:
forms.py
class SpecImageForm(ModelForm):
orig_image = forms.ImageField(required=False, widget=forms.FileInput)
class Meta:
model = SpecImage
fields = ['orig_image',]
# The intention is to have more than one SpecImageForm once this is working but for now the
# max_num is set to 1
SpecImageFormSet = inlineformset_factory(Spec, SpecImage, form=SpecImageForm, extra=1, max_num=1)
尽管针对它在我的模板中呈现的小部件明确设置了 FileInput - 仍然包括我认为不应该使用 FileInput 出现的复选框。
<fieldset>
<legend>Images</legend>
<input id="id_specimage_set-TOTAL_FORMS" name="specimage_set-TOTAL_FORMS" type="hidden" value="1" />
<input id="id_specimage_set-INITIAL_FORMS" name="specimage_set-INITIAL_FORMS" type="hidden" value="0" />
<input id="id_specimage_set-MAX_NUM_FORMS" name="specimage_set-MAX_NUM_FORMS" type="hidden" value="1" />
<ul>
<li>
<label for="id_specimage_set-0-orig_image">Orig image:</label>
<input id="id_specimage_set-0-orig_image" name="specimage_set-0-orig_image" type="file" />
</li>
<li>
<label for="id_specimage_set-0-DELETE">Delete:</label>
<input id="id_specimage_set-0-DELETE" name="specimage_set-0-DELETE" type="checkbox" />
<input id="id_specimage_set-0-id" name="specimage_set-0-id" type="hidden" />
<input id="id_specimage_set-0-car" name="specimage_set-0-car" type="hidden" />
</li>
</ul>
</fieldset>
模板的相关部分是这样的:
<fieldset>
<legend>Images</legend>
{{ image_form.management_form }}
{% for form in image_form %}
<ul>
{{ form.as_ul }}
</ul>
{% endfor %}
</fieldset>
我正在做的唯一稍微不同的是使用 inlineformset_factory。
我还尝试使用 widgets.py 覆盖小部件的呈现,但同样似乎无法摆脱默认设置 - 主要基于此 thread。
任何摆脱复选框的想法或解决方案将不胜感激!
【问题讨论】:
标签: django django-widget