繁体   English   中英

如何在Django表单集中更改DELETE字段的窗口小部件类型

[英]How do I change the widget type of the DELETE field in a django formset

我正在使用can_delete = True的表单集。 我想将DELETE字段的小部件更改为隐藏的输入。 我似乎找不到解决此问题的好方法。 我试过的是:

将表单的小部件更改为HiddenInput和/或在表单定义中添加一个隐藏字段:

class MyForm(ModelForm):
    DELETE = forms.BooleanField(widget=forms.HiddenInput)

    class Meta:
        model = MyModel
        widgets = {'DELETE' : forms.HiddenInput}

通过更改表单集来执行上述操作

class MyFormSet(BaseModelFormSet):

def add_fields(self, form, index):
    originalDeletion = None
    if DELETION_FIELD_NAME in form.fields:
        originalDeletion = form.fields[DELETION_FIELD_NAME]

    super(MyFormSet, self).add_fields(form,index)

    if originalDeletion is not None:
        form.fields[DELETION_FIELD_NAME] = originalDeletion

如果同时执行这两项操作,则实际上会将字段更改为隐藏,但这似乎有点hack(有效地覆盖了通常的add_fields方法)。 你应该怎么做?

==编辑==

事实证明,对于表单框架而言,使用隐藏字段并不是很好。 您绝对应该使用复选框,并使用CSS将其隐藏。 如果要在Django中调整复选框的css,我仍然认为您必须如上所述更改add_fields方法,然后可以使用该方法更改小部件的css。

完成您所需的最短代码是:

class MyFormSet(BaseFormSet):
    def add_fields(self, form, index):
        super(MyFormSet, self).add_fields(form, index)
        form.fields[DELETION_FIELD_NAME].widget = forms.HiddenInput()

不能将其视为黑客,因为在官方Django文档中已提及:

https://docs.djangoproject.com/zh-CN/1.4/topics/forms/formsets/#adding-additional-fields-to-a-formset

Django资料阅读:

如果输入的类型为“隐藏”,或者输入的类型为“ checkbox” 显示为:none,则不会更改任何内容。

恕我直言,CSS中的优雅方式如下所示:

td.delete input { display: none; }

或在JavaScript中:

$('td.delete input[type=checkbox]').hide()

或者,在管理员中:

django.jQuery('td.delete input[type=checkbox]').hide()

这似乎是一个更好的方向,因为:

  1. 不会更改您的JavaScript代码,并且
  2. 这是一行代码,而不是这么多的Python hack

self.can_delete设置为False解决了我的问题:

class MyFormSet(BaseFormSet): 
    def __init__(self, *args, **kwargs): 
        super(MyFormSet, self).__init__(*args, **kwargs) 
        self.can_delete = False 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM