如何更换django admin添加页面

时间:2013-02-04 16:35:35

标签: django django-admin

我正在使用Django 1.4和Grappelli

我需要一个与同一型号的更改页面完全不同的管理添加页面。不同的字段集,不同的readonly_fields(实际上没有用于添加),不同的内联(实际上没有用于添加)。 当它被提交时,我需要将它指向工厂函数,而不是沿着正常的创建路径。 但我需要它看起来像一个管理页面,我特别需要外键选择器,就像我进入正常的管理页面。

我尝试使用get_readonly_fields和朋友一段时间,但get_inline_instances只有1.5,我找不到另一个删除内联的钩子。

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

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

其中一个方向正朝着正确的方向发展吗?有谁知道我需要做什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

那么最终的作用是创建一个常规表单(而不是一个模型),其中包含我想要显式实例化的特定字段。

然后我将django.contrib.admin.options中的ModelAdmin.add_view复制到我的ModelAdmin中,然后我广泛地攻击了副本,其中一半的代码用于内联,所以其余的一半是围绕保存的我也不需要。

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

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

这种方法的好处是通过一些重新分解它可以用来在管理员的任何地方弹出通用输入表单。

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