django 管理站点的两个实例 - 模板

Posted

技术标签:

【中文标题】django 管理站点的两个实例 - 模板【英文标题】:Two instances of django admin site - templates 【发布时间】:2013-12-25 18:25:09 【问题描述】:

出于某种原因,我需要在我的项目中有两个不同的 Django 管理站点实例——默认管理站点和一个从 AdminSite 继承的类实例。

所以我创建了一个类MyAdminSite(AdminSite)

然后我写了类似的东西:

my_admin_site = MyAdminSIte(name='myadmin')

然后我在 urls.py 中添加了正确的条目。

一切正常。

但现在我想自定义一些模板。 在settings.py中:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),)

然后我创建了目录: /PROJECTDIR/templates/admin/PROJECTDIR/templates/myadmin

问题是,我根本无法在“myadmin”django 管理站点中扩展/覆盖模板。 例如,如果我在 /templates/admin/ 中添加一个空的“base_site.html”,那么两个管理站点都会变为空白。

但是当我将相同的文件添加到 /templates/myadmin/ 时,什么都没有发生。

有什么建议吗?

【问题讨论】:

【参考方案1】:

你可以覆盖AdminSite的类变量来指定不同的模板:

app_index_template = None
login_template = None
logout_template = None
password_change_template = None
password_change_done_template = None

你也可以覆盖ModelAdmin的类变量来指定不同的模板:

add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None

例如:

class MyAdminSite(AdminSite):
    app_index_template = "my/new/admin/app_index.html"

【讨论】:

是的,我确实知道。但是是否有任何选项可以以与默认 django 管理站点相同的方式执行此操作? 是的,您可以继承 AdminSite 并使用该对象。例如:docs.djangoproject.com/en/dev/ref/contrib/admin/… 但我实际上是 AdminSite 的子类化,它工作得很好,除了模板。我们是不是误会了? 如果您希望默认管理员的模板也发生变化,那么您还需要在那里使用 AdminSite 的子类。因此,对于您希望使用不同模板的每个管理界面,您需要使用上面的模板变量创建 AdminSite 的子类。或者,您可以照常替换默认模板,并使用上述答案中的变量为您的第二个管理员指定新模板。 好的,这是唯一的方法吗?自定义 AdminSite 子类的模板的唯一方法是修改您提到的这个变量?即使,比方说,我不会修改默认管理员?

以上是关于django 管理站点的两个实例 - 模板的主要内容,如果未能解决你的问题,请参考以下文章

django:我如何实际覆盖管理站点模板

Django 管理站点:TemplateDoesNotExist?

完全自定义 django 管理站点

为啥它呈现 django 管理站点而不是自定义注销页面

在应用程序 django 中使用 % url 'admin' % 引用管理站点

Django,如何将变量从 Django 管理员传递到模板?