2012-02-21 5 views
6

Я использую набор форм с can_delete = True. Я хочу изменить виджет поля DELETE на скрытый ввод. Кажется, я не могу найти хороший способ сделать это. То, что я попытался это:Как изменить тип виджета поля DELETE в наборе форм django

Изменение виджетов формы на 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). Как вы должны это делать?

== EDIT ==

Оказывается, что, используя скрытое поле не так хорошо со структурой формы в любом случае. Вы должны обязательно использовать флажок и скрыть его с помощью css. Если вы хотите отредактировать css флажка в Django, я все равно думаю, что вам нужно изменить метод add_fields, как указано выше, а затем вы можете изменить css виджета.

+0

Почему ** имеет ** быть типа = скрытом? Разве другие способы скрыть это тоже хорошо? – jpic

ответ

10

Это ничего не меняет, если ваш вход имеет тип = скрытый, или если он имеет тип = checkbox и дисплей: нет.

ИМХО элегантный способ в 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

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 следующим образом:

Смежные вопросы