Django:删除管理员用户更改表单中的“网站上的视图”按钮

时间:2011-12-28 23:15:48

标签: python django django-admin django-authentication

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

如何防止这种情况发生?

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

8 个答案:

答案 0 :(得分:7)

如果你点击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

答案 1 :(得分:4)

您可以使用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中添加了一项功能,可让您无法显示“网站上的视图”链接。

答案 2 :(得分:3)

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

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

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)

答案 3 :(得分: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)

答案 4 :(得分:1)

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

一般情况下升级django /时,请注意。

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

答案 5 :(得分:1)

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

admin.site.site_url = None

以上技巧对我非常有效。

答案 6 :(得分:0)

我使用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 /管理/ user_change_form.css

.change-form {
    visibility: hidden;
}

...静态/ JS /管理/ 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')
});

答案 7 :(得分:0)

使用 admin.site.site_url =&#34;您的网址在这里&#34; 在你的主应用程序的url.py中修改django页面上的&#34;访问网站&#34; 和 对于&#34; view_on_site&#34;除去 使用 在您的类中使用

的display_list view_on_site = False