如何在django formset中更改DELETE字段的窗口小部件类型

时间:2012-02-21 14:45:31

标签: python django

我正在使用带有can_delete = True的formset。我想将DELETE字段的小部件更改为隐藏的输入。我似乎无法找到一个好方法来做到这一点。我试过的是:

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

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

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

通过更改formset

执行上述操作
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

如果我这样做,它实际上确实将字段更改为隐藏,但这似乎有点像黑客(有效地覆盖了通常的add_fields方法)。你打算怎么做?

==编辑==

事实证明,使用隐藏字段对表单框架来说并不是那么好。你绝对应该使用一个复选框并用css隐藏它。如果你想调整Django中复选框的CSS,我仍然认为你必须改变上面的add_fields方法,这样你就可以改变小部件的css。

3 个答案:

答案 0 :(得分:23)

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

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/en/1.4/topics/forms/formsets/#adding-additional-fields-to-a-formset

Django的消息来源:

答案 1 :(得分:10)

如果您的输入为type = hidden,或者类型为= checkbox display: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黑客攻击

答案 2 :(得分:2)

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

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