2013-02-04 47 views
1

我使用Django 1.4和格拉佩利如何更换Django管理添加

我需要一个管理员添加是在同一个模型的改变页面完全不同的页面。不同的字段集,不同的readonly_fields(实际上没有添加),不同的内联(实际上没有添加)。 当它提交时,我需要将它关闭到一个工厂功能,而不是沿着正常的创建路径。 但我需要它看起来和行为像一个管理页面,我特别需要外键选择器,像我会在一个正常的管理页面。

我试着乱搞get_readonly_fields和朋友一段时间,但get_inline_instances只有1.5,我找不到另一个钩子去除内联。

然后我尝试使用get_urls替换视图和表单,但我无法弄清楚需要进入上下文才能使模板呈现。

我也尝试搞乱get_form,但ModelAdmin仍然期望窗体具有相同的字段。

这些标题之一是正确的方向吗?有谁知道我需要做什么?

回答

0

您可以通过将ModelAdmin的窗体属性设置为您自己的窗体类来覆盖管理窗体。

例如参见: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

class PersonForm(forms.ModelForm): 

    class Meta: 
     model = Person 
     exclude = ['name'] 

class PersonAdmin(admin.ModelAdmin): 
    exclude = ['age'] 
    form = PersonForm 
+0

您也可以覆盖表单模板:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#custom-template-options –

+0

如何覆盖它仅用于添加,而不用于更改。 –

+0

其实我可以用get_form做到这一点,但这只是问题的一小部分。 –

0

那么到底什么是工作创造一个正规形式(而不是的ModelForm)与特定领域我想明确地实例化。

然后,我将ModelAdmin.add_view从django.contrib.admin.options复制到我的ModelAdmin中,然后我广泛地拷贝了副本,其中一半的代码用于内联,因此,其余的一半都在这也是我不需要的。

在剩余的位中,您要查找并替换至少字段集,readonly_fields,表单和标题。

然后最后我用get_urls将添加url重定向到我的新视图。

这种方法的好处是有一点重新分解它可用于在管理中的任何地方弹出通用输入表单。

一个小小的Grappelli事情,要获得自动完成和相关查找,您需要在某个对象上指定autocomplete_lookup_fields和/或related_lookup_fields,并将该对象作为model_admin传递给helpers.AdminForm,通常这将是您的ModelAdmin,但它不会似乎并不关心对象究竟是什么,所以我把它们放在表单上并通过了。