2010-05-13 18 views

回答

10

您可以調用super後修改self.fields列表。

+0

所以,我會需要輸入的內容。例如,如果我想從模型中刪除字段「名稱」 – John 2010-05-13 11:54:35

+4

'如果'name'在self.fields:del self.fields ['name']' – KillianDS 2010-05-13 12:10:50

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:方法「老闆」級變化ProfessorAdmin:

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。

0

我做出這樣的:

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