我发现将ClearableFileInput定制为模型中包含模型中的ImageField的默认小部件非常困难。
特别是我不想要作为小部件一部分的删除复选框。我已尝试以多种方式自定义/覆盖渲染,以摆脱复选框,包括将窗口小部件设置为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覆盖窗口小部件的呈现,但同样似乎无法摆脱defualt设置 - 主要基于此thread。
任何能够摆脱复选框的想法或解决方案都会感激不尽!
答案 0 :(得分:0)
我认为这与使用默认can_delete参数设置为true的inlineformset_factory有关,无论我如何准备与其一起使用的表单,都存在。只需传递 can_delete = False 就可以删除删除复选框。
SpecImageFormSet = inlineformset_factory(Spec, SpecImage, form=SpecImageForm, extra=1, max_num=1, can_delete=False)
此外,当我在其上呈现表单时(不使用inlineformset_factory),没有“删除”复选框的标记。然后我发现this SO post解释了原因。
到达那里。