2012-02-21 43 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的來源爲:

相關問題