формы django исключают поля в init, а не в мета-классе - PullRequest
11 голосов
/ 13 мая 2010

Я хочу исключить определенные поля в функции инициализации модели формы в зависимости от переданного параметра, как мне это сделать?Я знаю, что могу добавить поля исключения, используя мета-класс модельной формы, но мне нужно, чтобы это было динамическим в зависимости от передаваемой переменной.

Ответы [ 6 ]

10 голосов
/ 13 мая 2010

Вы можете изменить список self.fields после вызова super.

2 голосов
/ 06 марта 2012

Вы должны использовать self._meta вместо self.Meta, потому что метод ModelForm.__new__ получает атрибуты из self.Meta и помещает их в self._meta.

2 голосов
/ 27 марта 2011

Вы должны использовать modelform_factory, чтобы создать форму на лету и передать поля, которые вы хотите исключить.

def django.forms.models.modelform_factory   (       
     model,
    form = ModelForm,
    fields = None,
    exclude = None,
    formfield_callback = lambda f: f.formfield()     
)   

Так что-то вроде

modelform_factory(MyModel, MyModelForm, exclude=('name',))
1 голос
/ 21 ноября 2011

Для исключения полей из подкласса я расширил класс ModelForm следующим образом:

 class ModelForm(djangoforms.ModelForm):
   def __init__(self, *args, **kwargs):
     super(ModelForm, self).__init__(*args, **kwargs)

     meta = getattr(self, 'Meta', None)
     exclude = getattr(meta, 'exclude', [])

     for field_name in exclude:
       if field_name in self.fields:
         del self.fields[field_name]
0 голосов
/ 11 февраля 2015

Я сделал так:

class Meta:
    exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at']
0 голосов
/ 20 сентября 2012

Просто заметьте: если ваша форма вызывается из класса ModelAdmin, просто создайте метод get_form для ModelAdmin:

def get_form(self, request, obj=None, **kwargs):
    exclude = ()

    if not request.user.is_superuser:
        exclude += ('field1',)

    if obj:
        exclude += ('field2',)

    self.exclude = exclude
    return super(ProfessorAdmin, self).get_form(request, obj, **kwargs)

PS: сменить ProfessorAdmin методом класса «владелец».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...