Django: 在admin用户修改表单中去掉“查看网站”按钮

13 投票
9 回答
8716 浏览
提问于 2025-04-17 09:11

get_absolute_url() 这个方法挺不错的,但在某些情况下其实用不上。django.contrib.auth.models.User 这个类默认就有这个方法,这导致我在项目的管理后台出现了一个坏链接。

我该怎么避免这种情况呢?

在我以前的一个项目里,我设置了一个自定义模板,把按钮的 HTML 去掉了。不过这样做听起来不太好,可能不太适合大规模使用。有没有更好的办法呢?

9 个回答

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,可以让你不显示“查看网站”这个链接。

7

如果你点击Django 1.7的链接,网站会告诉你:“这是一个不安全的Django版本,已经不再支持。请升级到更新的版本!”

对于Django 1.9,下面的解决方案在Django的文档中提到过,效果很好。

在我的应用的admin.py文件中

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

从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)

撰写回答