2011-12-28 29 views
8

phương thức get_absolute_url() rất hay, nhưng trong một số trường hợp không cần thiết. django.contrib.auth.models.User có nó được thiết lập theo mặc định, điều này gây ra các dự án của tôi để có một liên kết bị hỏng trong admin.Django: Xóa nút "xem trên trang web" trong quản trị viên Biểu mẫu thay đổi người dùng

Làm cách nào để ngăn điều đó xảy ra?

Trong một trong các dự án cũ của tôi, tôi đặt một mẫu tùy chỉnh mà tôi đã xóa html của nút, nó không giống như một giải pháp tốt có thể mở rộng. Có gì tốt hơn không?

+4

Bạn có ý nghĩa 'quy mô' là gì? Bạn có lo lắng về những gì sẽ xảy ra khi bạn muốn làm điều này trên hàng triệu mô hình khác nhau? Việc ghi đè mẫu chính xác là giải pháp mà tôi sẽ sử dụng cho việc này. –

+1

Đã được trả lời ở đây: http://stackoverflow.com/questions/964868/view-on-site –

Trả lời

1

Điều này có thể được thực hiện, mỗi mô hình, tính đến 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) 
+0

đây là câu trả lời hay nhất gần đây :-) – nemesisdesign

1

Như một phương sách cuối cùng, tôi có một ứng dụng monkey_patch ở dưới cùng của tôi INSTALLED_APPS mà đổi được xây dựng trong các ứng dụng contrib django trong những cách tôi đã không tìm thấy cách tốt hơn để sửa đổi như chiều dài Tên truy nhập, hình thức quản trị mặc định, __unicode__, v.v.

Chỉ cần xem lại khi bạn nâng cấp django/nói chung.

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

tôi chấp nhận câu trả lời này nhưng tôi không quá quan tâm đến việc sử dụng nó. Nhờ đề nghị mặc dù. – nemesisdesign

3

Tôi biết điều này là cũ nhưng tôi bắt gặp khi tôi phải làm điều tương tự.

Một giải pháp tốt hơn là để khỉ vá nó trong tệp accounts/admin.py khi bạn có accounts trong 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) 
4

Thay vì vá khỉ, bạn có thể ẩn nút ở phía máy khách bằng JavaScript. HTML của nút xem trên trang web trông giống như sau:

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

Nếu bạn chỉ ẩn thẻ neo, bạn sẽ nhận được một phần của nút tròn xuất hiện như được áp dụng trên thẻ li. Bây giờ tiếc là không có cách nào dễ dàng để sử dụng css để chọn thẻ li cụ thể vì nó không có một lớp, tên hoặc id trên đó. Vì vậy, chúng tôi có thể sử dụng jquery cung cấp cho bạn nhiều quyền kiểm soát trên bộ chọn của bạn. Đặt thông tin sau vào thư mục tĩnh của bạn. Ví dụ ở vị trí tĩnh/admin/user_change_form.js

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

admin.py của bạn sau đó có thể trông giống như thế này:

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) 

CẬP NHẬT

Một tính năng được thêm vào trong Django 1.7 ModelAdmin.view_on_site cho phép bạn không hiển thị liên kết “Xem trên trang web”.

+0

cảm ơn bạn đã cập nhật! – nemesisdesign

6

Nếu bạn nhấp vào liên kết Django 1.7, trang web sẽ cho bạn biết rằng "Phiên bản Django không an toàn của nó không còn được hỗ trợ nữa. Vui lòng nâng cấp lên phiên bản mới hơn!"

Đối với Django 1.9, giải pháp sau đây hoạt động tốt như đã đề cập trong Django documentation

trong myapp/admin.py

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

đây là câu trả lời hay nhất gần đây nhất, tôi đang làm điều này trong các dự án gần đây của tôi. – nemesisdesign

0

Tôi đang sử dụng giải pháp Django 1.4 và Marwan Alsabbagh làm việc tốt cho tôi. Mặc dù, khi mở/làm mới biểu mẫu Thay đổi người dùng, có một chớp mắt ngắn.Đó là vì JQuery chỉ ẩn nút này khi trang được tải.

Để giải quyết vấn đề nhỏ này, tôi đã sử dụng CSS để ẩn toàn bộ khối biểu mẫu thay đổi. Sau khi trang được nạp, khả năng hiển thị của khối này được khôi phục bằng phương tiện của JQuery. Vì vậy, mã của tôi trông như thế này:

admin.py:

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

... tĩnh/css/admin/user_change_form.css

.change-form { 
    visibility: hidden; 
} 

... tĩnh/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') 
}); 
Các vấn đề liên quan