Django:删除管理员用户更改表单中的“现场查看”按钮

Posted

技术标签:

【中文标题】Django:删除管理员用户更改表单中的“现场查看”按钮【英文标题】:Django: Remove "view on site" button in the admin User change form 【发布时间】:2012-01-29 13:07:19 【问题描述】:

get_absolute_url() 方法很酷,但在某些情况下不需要。 django.contrib.auth.models.User 默认设置了它,这会导致我的项目在管理员中的链接断开。

我怎样才能防止这种情况发生?

在我的一个旧项目中,我设置了一个自定义模板,在该模板中删除了按钮的 html,但这听起来不是一个可以扩展的好解决方案。有更好的吗?

【问题讨论】:

你是什么意思'规模'?当您想在数百万个不同的模型上执行此操作时,您是否担心会发生什么?模板覆盖正是我要使用的解决方案。 已经在这里回答:***.com/questions/964868/view-on-site 【参考方案1】:

如果您单击 Django 1.7 链接,该站点会告诉您“它是一个不安全的 Django 版本,不再受支持。请升级到更新的版本!”

对于 Django 1.9,以下解决方案可以正常工作,如 Django documentation 中所述

在 myapp/admin.py 中

from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
    # Disable View on Site link on admin page
    site_url = None

【讨论】:

这是最近的最佳答案,我在最近的项目中这样做。【参考方案2】:

从 django 1.7 开始,每个模型都可以做到这一点。

# myapp/admin.py
from django.contrib import admin
from myapp.models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    view_on_site = False

admin.site.register(MyModel,MyModelAdmin)

【讨论】:

这是最近的最佳答案 :-)【参考方案3】:

您可以使用 javascript 在客户端隐藏按钮,而不是猴子修补。站点视图按钮的 HTML 如下所示:

<li><a href="/admin/r/4/2/" class="viewsitelink">View on site</a></li>

如果您只是隐藏锚标记,您将看到圆形按钮的一部分,因为它应用于 li 标记。现在不幸的是,没有简单的方法可以使用 css 来选择特定的 li 标签,因为它上面没有类、名称或 id。所以我们可以使用 jquery 来让你更好地控制你的选择器。将以下内容放入您的静态文件夹中。例如在位置 static/admin/user_change_form.js

django.jQuery( document ).ready(function($) 
    $(".viewsitelink").parent().css('display', 'none')
);

你的 admin.py 可能看起来像这样:

from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.admin import site

class CustomUserAdmin(UserAdmin):
    class Media:
        js = ['admin/user_change_form.js']

site.unregister(User)
site.register(User, CustomUserAdmin)

更新

在 Django 1.7 ModelAdmin.view_on_site 中添加了一项功能,该功能可让您不显示“现场查看”链接。

【讨论】:

【参考方案4】:

我知道这很旧,但是当我不得不做同样的事情时,我遇到了它。

INSTALLED_APPS 中有accounts 时,更好的解决方案是在accounts/admin.py 文件中对其进行修补。

admin.site.unregister(User)
# We don't want a broken View on Site link.  Thanks for that, contrib.auth!
del User.get_absolute_url
admin.site.register(User, MyUserAdmin)

【讨论】:

【参考方案5】:

Django 2.0 以上可以添加默认管理员

admin.site.site_url = None

以上技巧对我很有效。

【讨论】:

【参考方案6】:

作为最后的手段,我在INSTALLED_APPS 底部有一个monkey_patch 应用程序,它以我还没有找到更好的修改方式(例如用户名长度、默认管理表单)修改内置的 django contrib 应用程序、__unicode__

一般来说,升级 django / 时请小心。

from django.contrib.auth.models import User
del User.get_absolute_url

【讨论】:

我接受这个答案,但我不太热衷于使用它。不过感谢您的建议。【参考方案7】:

我正在使用 Django 1.4,Marwan Alsabbagh 的解决方案对我来说效果很好。虽然,当打开/刷新用户更改表单时,会有短暂的闪烁。那是因为 JQuery 只有在页面加载时才会隐藏这个按钮。

为了解决这个小问题,我使用 CSS 来隐藏整个 .change-form 块。加载页面后,此块的可见性通过 JQuery 恢复。所以,我的代码如下所示:

admin.py:

class Media:
    js = ['js/admin/user_change_form.js']
    css = 'all': ('css/admin/user_change_form.css',)

...静态/css/admin/user_change_form.css

.change-form 
    visibility: hidden;

...静态/js/admin/user_change_form.js

/* Do not show 'View on site' button in User change form */
django.jQuery( document ).ready(function($) 
    $(".viewsitelink").parent().css('display', 'none')
    /* restore visibility of the page (hidden in css to avoid blinking) */
    $(".change-form").css('visibility', 'visible')
);

【讨论】:

【参考方案8】:

使用 admin.site.site_url = "你的网址" 在您的主应用程序的 url.py 中修改 django 页面上的 “访问站点” 和 用于“view_on_site”移除 采用 view_on_site = False 在你的类中,display_list 用于

【讨论】:

【参考方案9】:

在您的应用配置 (apps.py) 中执行以下操作:

class MyAppConfig(AppConfig):
    def ready(self):
        admin.site.site_url = None

同样适用于 Django 4.0。

【讨论】:

以上是关于Django:删除管理员用户更改表单中的“现场查看”按钮的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的动态表单要求

当浏览器中的值更改时如何刷新 django 管理表单?

从 django 管理操作中间页面重定向到更改表单页面

如何根据用户输入动态更改 django 中的表单(提交前)

django admin中的外键表单字段

Django - 管理员 - 表单更改