2010-05-13 14 views

Respuesta

10

Puede modificar la lista self.fields después de llamar super.

+0

así que lo que voy a necesitar para escribir. por ejemplo, si quería eliminar el campo 'nombre' del modelo – John

+4

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

2

Debe usar modelform_factory para crear el formulario sobre la marcha y pasarlo en los campos que desea excluir.

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

así que algo como

modelform_factory(MyModel, MyModelForm, exclude=('name',)) 
1

relacionada, para excluir campos de una sub-clase, que han ampliado la clase ModelForm así:

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

que puedes usar self._meta en lugar de self.Meta, porque el método ModelForm.__new__ obtiene atributos del formulario self.Meta y los pone en self._meta.

0

para notar: si el formulario se llama desde una clase ModelAdmin, basta con crear un método para la 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: cambio ProfessorAdmin por la clase método de "propietario".

0

hice así:

class Meta: 
    exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at'] 
Cuestiones relacionadas