2013-10-25 110 views
0

有没有什么办法可以根据需要更新的对象加载不同的管理员窗体来编辑对象?Django管理模式的不同形式

例如 - 我们有一个MPTTModelAdmin对象。而对于根对象,我们不希望看到某些字段:

class RootObjectForm(ModelForm): 
    class Meta: 
     model = Author 
     exclude = ('title',) 


class ChildObjectForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'birth_date') 

但我不知道如何让对象字段中forms.py或admin.py。

回答

0

你总是可以提供自己的表单类一类的ModelAdmin:https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

从那里,你可以通过访问关键领域,就像任何其他的Django形式:

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(MyModeForm, self).__init__(*args, **kwargs) 

     # access whatever field by key 
     # self.fields['field-name'] 
+0

对不起,也许我不明白的东西,但如下因素代码: 从django.forms进口的ModelForm 从mptt_test.models进口第一类 类CategoryForm(的ModelForm): 类元: 模型=类别 DEF __init __(个体,*指定参数时,** kwargs): 超级(CategoryForm,自我).__ INIT __(*指定参数时,** kwargs) 打印self.fields [ '标题'] 打印: _ _ 如果我尝试访问特殊的标准MPTT字段,例如_level_(self.fields ['level']) - 我为此类丑陋格式生成_KeyError_ – user2919162

+0

抱歉... 4个空格不起作用 – user2919162

+0

我不是非常熟悉MPTT ......它有一个Django管理员窗体混搭或类,你的ModelAdmin应该继承吗?这可能解释了缺失的领域。 – Brandon

0

在forms.py文件你可以在两个阶段获得对象字段和它们的值。

1:表单提交时。 清洁方法进行初始验证。

def clean(self): 
    """ validation of address form """ 
    cleaned_data = super(WebsiteAddressForm, self).clean() 
    field1_value = self.cleaned_data.get("field1") 
    print field1_value 
    return cleaned_data 

2:表单初始化时。 ____init____方法将会调用。

class MyForm(forms.ModelForm): 
    class Meta: 
     model = Model1 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     #self.fields['field1'] 
+0

这样做...但_print self.fields ['title'] _ prints:_ _ – user2919162

+0

这只是为了给你一个想法。在____init____你可以初始化任何字段的值。 self.fields ['field1'] =“你好,这是默认值” –

+0

我看到...但有没有什么办法来获得字段值时,我们只是来寻找更新存在的对象? 例如 - 如果某些_news_包含“some_field”且其值已设置为“1” - 在管理员编辑窗体中不显示此消息的某些文件。在其他情况下 - 显示此字段 – user2919162