Django - 删除ClearableFileInput小部件中的Checkbox

时间:2014-03-21 14:19:53

标签: django django-widget

我发现将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

任何能够摆脱复选框的想法或解决方案都会感激不尽!

1 个答案:

答案 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解释了原因。

到达那里。