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:删除管理员用户更改表单中的“现场查看”按钮的主要内容,如果未能解决你的问题,请参考以下文章