2011-12-28 11 views
8

get_absolute_url() विधि शांत है, लेकिन कुछ मामलों में इसकी आवश्यकता नहीं है। django.contrib.auth.models.User ने इसे डिफ़ॉल्ट रूप से सेट किया है, इस कारण मेरी परियोजनाओं में व्यवस्थापक में टूटा हुआ लिंक है।Django: व्यवस्थापक में "साइट पर देखें" बटन निकालें उपयोगकर्ता परिवर्तन फ़ॉर्म

मैं इसे कैसे होने से रोक सकता हूं?

मेरी पुरानी परियोजनाओं में से एक में मैंने एक कस्टम टेम्पलेट सेट किया जिसमें मैंने बटन के HTML को हटा दिया, यह एक अच्छा समाधान की तरह नहीं लगता है जो हालांकि स्केल करेगा। कुछ भी बेहतर है?

+4

आपका मतलब 'स्केल' क्या है? क्या आप इस बारे में चिंतित हैं कि जब आप लाखों अलग-अलग मॉडल पर ऐसा करना चाहते हैं तो क्या होता है? टेम्पलेट ओवरराइडिंग वास्तव में वह समाधान है जिसका मैं उपयोग करता हूं। –

+1

पहले से ही यहां उत्तर दिया गया है: http://stackoverflow.com/questions/964868/view-on-site –

उत्तर

1

यह किया जा सकता है, प्रति मॉडल 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

यह सबसे हाल का सबसे अच्छा जवाब है :-) – nemesisdesign

1

एक अंतिम उपाय के रूप में, मैं, मेरी INSTALLED_APPS जो तरीकों से Django योगदान क्षुधा में बनाया को संशोधित करता है के तल पर एक monkey_patch एप्लिकेशन मैं ऐसे उपयोगकर्ता नाम लंबाई, डिफ़ॉल्ट व्यवस्थापक रूपों, __unicode__ के रूप में संशोधित करने के लिए बेहतर तरीके नहीं मिला है है आदि

जब आप django/सामान्य रूप से अपग्रेड करते हैं तो बस अपनी पीठ देखें।

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

मैं इस उत्तर को स्वीकार करता हूं लेकिन मैं इसका उपयोग करने के लिए उत्सुक नहीं हूं। फिर भी सुझाव के लिए धन्यवाद। – nemesisdesign

3

मुझे पता है कि यह पुराना है, लेकिन जब मुझे वही करना पड़ा तो मैं इसे पार कर गया।

फ़ाइल में बंदर को पैच करने के लिए एक बेहतर समाधान होगा जब आपके पास 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

बंदर पैचिंग के बजाय आप जावास्क्रिप्ट का उपयोग कर क्लाइंट साइड पर बटन छुपा सकते हैं। साइट बटन पर देखने के एचटीएमएल इस तरह दिखता है:

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

तुम सिर्फ छिपाने एंकर टैग आपको लगता है कि के रूप में प्रदर्शित दौर बटन का हिस्सा मिल जाएगा ली टैग पर लागू किया जाता है तो। दुर्भाग्यवश, उस विशिष्ट ली टैग का चयन करने के लिए सीएसएस का उपयोग करने का कोई आसान तरीका नहीं है क्योंकि इसमें कक्षा, नाम या आईडी नहीं है। तो हम jquery का उपयोग कर सकते हैं जो आपको अपने चयनकर्ताओं पर अधिक नियंत्रण देता है। अपने स्थिर फ़ोल्डर में निम्नलिखित रखें। स्थान स्थिर/व्यवस्थापक में उदाहरण के लिए/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 जो आपको "साइट पर देखें" लिंक प्रदर्शित नहीं करने देता है।

+0

अद्यतन के लिए धन्यवाद! – nemesisdesign

6

यदि आप 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 
+0

यह सबसे हालिया सबसे अच्छा जवाब है, मैं इसे अपनी हाल की परियोजनाओं में कर रहा हूं। – nemesisdesign

0

मैं Django 1.4 का उपयोग कर रहा हूं और मारवान अलसबाग के समाधान ने मेरे लिए ठीक काम किया है। हालांकि, जब उपयोगकर्ता परिवर्तन फ़ॉर्म खोलना/ताज़ा करना एक छोटा झपकी था।इसका कारण यह है कि जब jQuery लोड होता है तो JQuery केवल इस बटन को छुपाता है।

इस मामूली समस्या को हल करने के लिए मैंने पूरे .change-form ब्लॉक को छुपाने के लिए सीएसएस का उपयोग किया। पेज लोड होने के बाद इस ब्लॉक की दृश्यता JQuery के माध्यम से बहाल की जाती है।

admin.py:

class Media: 
    js = ['js/admin/user_change_form.js'] 
    css = {'all': ('css/admin/user_change_form.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') 
}); 
संबंधित मुद्दे