2012-02-21 41 views
6

我正在使用can_delete = True的formset。我想将DELETE字段的小部件更改为隐藏的输入。我似乎无法找到一个好办法做到这一点。我已经试过是:如何更改django formset中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 

如果我这样做,它确实将字段更改为隐藏,但这似乎有点破解(有效覆盖通常的add_fields方法)。你应该如何做到这一点?

== ==编辑

事实证明,使用隐藏字段是不是与形式框架,这样很好的反正。你一定要使用复选框并用css隐藏它。如果你想调整Django复选框的CSS,我仍然认为你必须改变上面的add_fields方法,然后你可以改变这个小部件的CSS。

+0

它为什么** **已为类型=隐藏的?隐藏它的其他方法不是很好吗? – jpic 2012-02-21 15:04:54

回答

10

如果您的输入类型= hidden,或者其类型=复选框 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黑客
+0

啊 - 所以你把它藏在javascript/css中。这就说得通了。仍然看起来很奇怪,没有办法直接在django中做到这一点 - 我想相当于将一个css类添加到隐藏它的小部件。似乎你不能这样做,但它不会让你重写DELETE小部件。 – Blaise 2012-02-21 15:21:31

20

最短的代码来完成你需要的是:

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的来源为:

相关问题