1

我正在使用 Django 1.4 和 Grappelli

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

我试着和 get_readonly_fields 和朋友们混了一阵子,但 get_inline_instances 只是 1.5,我找不到另一个用于删除内联的钩子。

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

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

其中之一是否朝着正确的方向前进?有人知道我需要做什么吗?

4

2 回答 2

0

所以最终起作用的是创建一个带有我想要显式实例化的特定字段的常规表单(而不是模型表单)。

然后我将 django.contrib.admin.options 中的 ModelAdmin.add_view 复制到我的 ModelAdmin 中,然后我对副本进行了大量修改,其中一半的代码用于内联,所以剩下的一半是保存的,我也不需要。

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

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

这种方法的好处是进行了一些重构,它可以用于在管理员的任何地方弹出通用输入表单。

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

于 2013-02-06T11:06:58.407 回答
0

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

例如参见: 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
于 2013-02-04T17:03:03.710 回答