【问题标题】:Django Extend admin indexDjango 扩展管理索引
【发布时间】:2014-11-03 02:20:27
【问题描述】:

我希望对 Django 管理界面进行一些修改(具体来说,删除“更改”链接,同时将模型名称保留为指向页面的链接以更改实例)。我可以通过从管理应用程序复制和粘贴 index.html 并修改模板来实现这一点,但我宁愿只通过扩展模板来覆盖有问题的部分 - 但是我不确定如何作为模板来实现这一点有相同的名字。我也对实现这种效果的替代方法持开放态度。 (django 1.7, python 3.4.1)

【问题讨论】:

  • 如果您不希望显示“更改”链接,最好通过覆盖相关 AdminModel 上的 has_change_permission() 来完成。(我意识到这对于现在使用它的人来说已经过时了)

标签: python django django-admin


【解决方案1】:

解决了 - 我在 admin.py 中设置了admin.site.index_template = "my_index.html",然后 my_index 模板可以从 admin/index.html 继承而不会发生名称冲突。

【讨论】:

  • 太棒了!极好的!简单的!我做了同样的事情,但在项目 urls.py.
  • 这应该进入documentation,因为它很简单
【解决方案2】:

覆盖 AdminSite 的 index_template 可能更简洁:

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

尽管如此,这可能会使外部代码对外部代码更加友好:在绑定之前在自定义实例上更改 this,或者子类化自定义 AdminSite 并覆盖那里,然后注册该自定义 AdminSite。

相关文档:

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

编辑:澄清一下 - 这将允许您覆盖您在模板中更改的部分,从而继承任何上游更改。

【讨论】:

    【解决方案3】:

    如果您想删除模型的更改权限,您可以在模型的管理类中以编程方式执行此操作,而不是修改模板。这使您能够根据用户条件启用/禁用链接。更改权限将反映在更改列表、更改表单和管理索引中。

    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

    【讨论】:

    • 这不是我想要达到的。更改权限应该仍然可用,因为单击管理索引上的模型名称链接到与“更改”按钮相同的页面。我只希望删除更改按钮,而不是通过其他链接进行更改的能力
    • 好的,那么你最好只调整模板代码。
    【解决方案4】:

    请参阅此答案以覆盖标准管理模板(未链接到特定模型)

    您需要在您的settings.INSTALLED_APPS 中设置BEFORE、'django.contrib.admin' 覆盖模板的应用程序。

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

    【讨论】:

      【解决方案5】:

      如果你想在右侧边栏添加新内容,我建议使用 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 %}
      

      【讨论】:

        猜你喜欢
        • 2011-03-17
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多