【问题标题】:how do I replace the django admin add page如何替换 django 管理添加页面
【发布时间】:2013-01-19 09:53:11
【问题描述】:

我正在使用 Django 1.4 和 Grappelli

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

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

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

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

其中一个方向是否正确?有人知道我需要做什么吗?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以通过将 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
    

    【讨论】:

    • 您也可以覆盖表单模板:docs.djangoproject.com/en/dev/ref/contrib/admin/…
    • 我如何覆盖它只是为了添加,而不是为了改变。
    • 其实我可以用get_form做到这一点,但这只是问题的一小部分。
    • 你的意思是覆盖保存方法?
    • 创建自定义表单并将其添加到管理员后,您只需将 def save 功能添加到 from 即 def save(self, force_insert=False, force_update=False)。例如:stackoverflow.com/questions/817284/…
    【解决方案2】:

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

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

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

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

    这种方法的好处是稍作重构,它可用于在管理员的任何位置弹出通用输入表单。

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

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2011-08-19
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多