Django: 在admin用户修改表单中去掉“查看网站”按钮
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)