Как изменить тип виджета поля DELETE в наборе форм Django - PullRequest
7 голосов
/ 21 февраля 2012

Я использую форму с can_delete = True. Я хочу изменить виджет поля УДАЛИТЬ на скрытый ввод. Я не могу найти хороший способ сделать это. Я попробовал:

Измените виджет формы на 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. Если вы хотите настроить css флажка в Django, я все же думаю, что вы должны изменить метод add_fields, как указано выше, который затем позволяет вам изменить css виджета.

Ответы [ 3 ]

23 голосов
/ 09 октября 2012

Самый короткий код для выполнения того, что вам нужно:

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 для чтения:

10 голосов
/ 21 февраля 2012

Это ничего не меняет, если ваш ввод имеет тип = скрытый или если он имеет тип = флажок и 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 голосов
/ 21 марта 2018

Установка self.can_delete на False решила мою проблему:

class MyFormSet(BaseFormSet): 
    def __init__(self, *args, **kwargs): 
        super(MyFormSet, self).__init__(*args, **kwargs) 
        self.can_delete = False 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...