2010-05-13 10 views
11

Voglio escludere determinati campi nella funzione init di un modelform a seconda di un parametro passato, come posso fare? So che posso aggiungere escludere i campi utilizzando la classe meta di una forma modello, ma ho bisogno di questo per essere dinamica in base alla variabile passata in.django forms esclude i campi su init piuttosto che sulla meta classe

Grazie

risposta

10

È possibile modificare l'elenco self.fields dopo aver chiamato super.

+0

così che cosa avrei bisogno di digitare. per esempio se volessi rimuovere il campo 'nome' dal modello del modello – John

+4

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

2

È necessario utilizzare modelform_factory per creare il modulo al volo e passare nei campi che si desidera escludere.

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

Quindi qualcosa di simile

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

correlati, per escludere i campi da una sotto-classe, ho hanno esteso la classe ModelForm in questo modo:

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

si dovrebbe usare self._meta invece di self.Meta, perché il metodo ModelForm.__new__ ottiene gli attributi modulo self.Meta e li inserisce in self._meta.

0

Solo per notare: se il modulo viene chiamato da una classe ModelAdmin, basta creare un metodo per 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: il cambiamento ProfessorAdmin con il metodo di classe "proprietario".

0

ho fatto in questo modo:

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