扩展Django管理索引

4 投票
5 回答
5494 浏览
提问于 2025-04-20 16:39

我想对Django的管理界面做一些修改,具体来说,就是想去掉“更改”这个链接,但保留模型名称作为链接,方便跳转到修改实例的页面。我可以通过复制粘贴admin应用里的index.html文件,然后在模板上进行修改来实现这个目标,但我更希望能通过扩展模板的方式只覆盖需要修改的部分。不过我不太确定怎么做到这一点,因为这些模板的名字是一样的。我也愿意尝试其他方法来实现这个效果。(django 1.7,python 3.4.1)

5 个回答

-1

如果你想往右侧边栏添加新的内容,我建议你使用jQuery。

{% extends "admin/index.html" %}
{% block extrahead %}
  <script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.min.js"></script>
  <script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
{% endblock %}
{% block sidebar %}
  {{ block.super }}
  <div id="extra_sidebar">
    <div class="module">
      <h2>Custom functions</h2>
      <a style="padding-left: 15px" href="/admin/extra/">My extra link</a>
    </div>
  </div>
  <script>
    (function ($) {
      $(document).ready(function ($) {
        $('#content-related').prepend($('#extra_sidebar').contents());
      });
    })(django.jQuery);
  </script>
{% endblock %}
0

如果你想要去掉某个模型的修改权限,可以在这个模型的管理类里直接编程实现,而不是去改模板。这样做的好处是你可以根据用户的不同条件来决定是否显示修改链接。修改权限的变化会在修改列表、修改表单和管理首页上体现出来。

from django.contrib import admin
from your_app.models import YourModel

class CustomModelAdmin(admin.ModelAdmin):
    def has_change_permission(self, obj=None):
        # check request.user creds, etc
        return False

admin.site.register(YourModel, CustomModelAdmin)

想了解更多关于Django管理选项的信息,可以查看这个链接:https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission

1

请查看这个回答,了解如何覆盖标准的管理模板(这不是针对特定模型的)

在你的 settings.INSTALLED_APPS 中,必须先把你要覆盖模板的应用放在 django.contrib.admin 之前。

https://stackoverflow.com/a/39964906/24718

3

可能更简单的方法是重写AdminSite的index_template:

from django.contrib.admin.sites import AdminSite
AdminSite.index_template = '...'

不过,这样做可能会让外部代码更友好,可以通过在绑定之前在自定义实例上更改,或者创建一个自定义的AdminSite子类并在那儿重写,然后注册这个自定义的AdminSite来实现。

相关文档:

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#root-and-login-templates

编辑:为了更清楚地说明 - 这样做可以让你只重写模板中你想更改的部分,从而继承任何上游的更改。

8

我搞定了这个问题 - 我在admin.py文件里设置了admin.site.index_template = "my_index.html",这样my_index这个模板就可以从admin/index.html继承,而不会出现名字冲突。

撰写回答