【问题标题】:Django - Remove the Checkbox in ClearableFileInput widgetDjango - 删除 ClearableFileInput 小部件中的复选框
【发布时间】: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


    【解决方案1】:

    我认为这与应用默认 can_delete 参数设置为 true 的 inlineformset_factory 有关,无论我如何准备要使用的表单,它都存在。只需传递 can_delete=False 即可摆脱 Delete 复选框。

    SpecImageFormSet = inlineformset_factory(Spec, SpecImage, form=SpecImageForm, extra=1, max_num=1, can_delete=False)
    

    此外,当我自己渲染表单时(不使用 inlineformset_factory),没有“删除复选框”的迹象。然后我发现this SO post 解释了原因。

    到达那里。

    【讨论】:

    • def 不是,可以删除的是 SpecImage 的实例而不是它的字段!
    猜你喜欢
    • 2014-10-01
    • 2013-11-15
    • 2015-08-30
    • 2013-06-16
    • 1970-01-01
    • 2019-08-16
    • 2012-09-10
    • 2010-11-08
    • 2018-11-08
    相关资源
    最近更新 更多