2010-05-13 12 views
11

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

Благодаря

ответ

10

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

+0

так, что бы мне нужно напечатать. например, если бы я хотел удалить поле 'name' из modelform – John

+4

'if 'name' в self.fields: del self.fields ['name']' – KillianDS

2

Вы должны использовать 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

, связанные, чтобы исключить поля из суб-класса, я расширил класс 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] 
2

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

0

Просто к сведению: если форма вызывается из класса 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 классом метода «владельца».

0

Я сделал так:

class Meta: 
    exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at'] 
Смежные вопросы