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

发布于 2024-12-23 09:15:17 字数 197 浏览 2 评论 0原文

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

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

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

get_absolute_url() method is cool, but in some cases is not needed. django.contrib.auth.models.User has it set by default, this cause my projects to have a broken link in the admin.

How can I prevent that from happening?

In one of my old projects I set a custom template in which I removed the html of the button, it doesn't sound like a good solution that would scale though. Anything better?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

星軌x 2024-12-30 09:15:17

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

This can be done, per model, as of 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)
只怪假的太真实 2024-12-30 09:15:17

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

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

在 myapp/admin.py 中

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

If you click on Django 1.7 link, the site will tell you that "Its an insecure version of Django that is no longer supported. Please upgrade to a newer release!"

For Django 1.9, following solution works fine as mentioned in the Django documentation

in myapp/admin.py

from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
    # Disable View on Site link on admin page
    site_url = None
冷心人i 2024-12-30 09:15:17

您可以使用 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 让您没有显示“现场查看”链接。

Instead of monkey patching you can hide the button on the client side using JavaScript. The HTML of the view on site button looks like this:

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

If you just hide the anchor tag you will get part of the round button appearing as that is applied on the li tag. Now unfortunately there is no easy way to use css to select that specific li tag since it doesn't have a class, name or id on it. So we can use jquery which gives you more control on your selectors. Put the following in your static folder. For example in the location static/admin/user_change_form.js

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

Your admin.py could then look something like this:

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)

UPDATE

A feature was added in Django 1.7 ModelAdmin.view_on_site which lets you not display the “View on site” link.

咋地 2024-12-30 09:15:17

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

更好的解决方案是当您在 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)

I know this is old but I came across it when I had to do the same thing.

A better solution would be to monkey patch it in an accounts/admin.py file when you have accounts in 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)
Spring初心 2024-12-30 09:15:17

Django 2.0 上面你可以添加默认管理

admin.site.site_url = None

上面的技巧对我来说非常有效。

Django 2.0 above you can add in default admin

admin.site.site_url = None

Above trick worked for me very well.

浅忆 2024-12-30 09:15:17

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

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

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

As a last resort, I have a monkey_patch app at the bottom of my INSTALLED_APPS which modifies the built in django contrib apps in ways I haven't found better ways to modify such as username length, default admin forms, __unicode__, etc.

Just watch your back when you upgrade django / in general.

from django.contrib.auth.models import User
del User.get_absolute_url
暖伴 2024-12-30 09:15:17

我正在使用 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',)}

...static/css/admin/user_change_form.css

.change-form {
    visibility: hidden;
}

...static/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')
});

I'm using Django 1.4 and Marwan Alsabbagh's solution worked fine for me. Although, when opening/refreshing User change form there was a short blink. That is because JQuery hides this button only when page is loaded.

To solve this minor issue I used CSS to hide the whole .change-form block. After page is loaded this block's visibility is restored by means of JQuery. So, my code looks like this:

admin.py:

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

...static/css/admin/user_change_form.css

.change-form {
    visibility: hidden;
}

...static/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')
});
情绪失控 2024-12-30 09:15:17

使用
admin.site.site_url = "这里是您的网址"
在主应用程序的 url.py 中修改 django 页面上的“访问站点”

用于删除“view_on_site”
使用
view_on_site = False 在您的班级中,其中 display_list 为

use
admin.site.site_url = "your url here"
in url.py of ur main app to modify the "visit site" on django page
and
for "view_on_site" removal
use
view_on_site = False in ur class with display_list for

丶视觉 2024-12-30 09:15:17

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

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

也适用于 Django 4.0。

Inside your app config (apps.py) do this:

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

Works in Django 4.0 as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文