首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django内联表单集中删除"extra“表单上的"Delete”复选框

如何在Django内联表单集中删除"extra“表单上的"Delete”复选框
EN

Stack Overflow用户
提问于 2018-03-22 18:29:22
回答 5查看 5.1K关注 0票数 7

我在Django中使用内联表单集,对于每个显示一个“额外”表单的项,用于添加另一个对象。

现有对象的表单具有"Delete“复选框,用于删除该对象,这很有意义。

但“额外”表单也有这些“删除”复选框...这没有任何意义,因为没有要删除的内容。Django admin中的内联表单不会为“额外”表单显示这些“删除”复选框。

如何删除“额外”内联表单上的这些复选框?

我的模板的内联表单集部分类似于(simplified, full version on GitHub):

代码语言:javascript
复制
{% for bookimage_form in form.forms %}
  {% for hidden_field in bookimage_form.hidden_fields %}
    {{ hidden_field.errors }}
  {% endfor %}

  {{ bookimage_form.as_table }}
{% endfor %}

下面的"Delete“复选框看起来是多余的:

EN

回答 5

Stack Overflow用户

发布于 2018-03-22 19:07:01

您可以使用InlineModelAdmin类的can_delete设置(TabularInline继承自InlineModelAdmin):

代码语言:javascript
复制
class BookImageInline(admin.TabularInline):
    model = BookImage
    extra = 1
    can_delete = False
票数 8
EN

Stack Overflow用户

发布于 2021-04-20 11:46:34

对于Django 3.2+ (link)的更新,你现在可以将can_delete_extra作为False传递给formset_factory,或者它扩展类来从额外的表单中删除复选框

can_delete_extra在Django 3.2中的新特性。

BaseFormSet.can_delete_extra

默认值: True

在设置can_delete=True时,指定can_delete_extra=False将删除删除额外表单的选项。

如果您的Django版本低于3.2,并且不希望升级,请使用以下方法覆盖BaseFormSet:

代码语言:javascript
复制
class CustomFormSetBase(BaseModelFormSet):
        
    def add_fields(self, form, index):
        super().add_fields(form, index)
        if 'DELETE' in form.fields and form.instance.pk: # check if have instance
            form.fields['DELETE'] = forms.BooleanField(
                label=_('Delete'),
                widget=forms.CheckboxInput(
                    attrs={
                        'class': 'form-check-input'
                    }
                ),
                required=False
            )
        else:
            form.fields.pop('DELETE', None)


YourFormSet = modelformset_factory(
                formset=CustomFormSetBase,
                can_delete=True,
                extra=2
            )

他们仅用了13年时间就添加了此>.>

票数 2
EN

Stack Overflow用户

发布于 2018-10-15 13:02:44

当你遍历表单时,这里有一种在模板中实现的方法:

代码语言:javascript
复制
{% if bookimage_form.instance.pk %}
  <small><b>{{ bookimage_form.DELETE.label_tag }}</b></small><br>
  {{ bookimage_form.DELETE}}
{% else %}
{% endif %}

不过,您不能使用我不认为的as_table()方法。您必须在表单中表示所有其他字段。

在初始化表单之后,但在进入上下文之前,您可以尝试另一件事:

代码语言:javascript
复制
for f in form.forms: 
    if not f.instance.pk: 
        f.fields['DELETE'] = None 

不确定这将如何在表格中出现,但您可能可以随意修改这个想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49426284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档