Django व्यवस्थापक - एक विशिष्ट मॉडल के लिए 'जोड़ें' कार्रवाई को अक्षम करें


147

मेरे पास कई मॉडलों और रूपों के साथ एक django साइट है। मेरे पास कई कस्टम फ़ॉर्म और फ़ॉर्मेट और इनलाइनफ़ॉर्मसेट और कस्टम सत्यापन और कस्टम क्वेरी हैं। इसलिए ऐड मॉडल एक्शन उन रूपों पर निर्भर करता है, जिनमें अन्य चीजों की जरूरत होती है, और django एडमिन में 'ऐड मॉडल' एक कस्टम क्वेरी से 500 का होता है।

एक निश्चित मॉडल के लिए 'Add $ MODEL' कार्यक्षमता को निष्क्रिय करने के लिए वैसे भी क्या है?

मैं /admin/appname/modelname/add/एक 404 (या उपयुक्त 'दूर जाना' त्रुटि संदेश) देना चाहता हूं, मैं नहीं चाहता कि '$ MODELNAME' बटन /admin/appname/modelnameदेखें।

Django व्यवस्थापक व्यवस्थापक कार्यों को निष्क्रिय करने का एक तरीका प्रदान करता है (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#diseable-actions) हालांकि इस मॉडल के लिए एकमात्र क्रिया 'delete_selected' है। यानी एडमिन एक्शन केवल मौजूदा मॉडल पर ही काम करता है। क्या ऐसा करने के लिए कुछ django-esque तरीका है?


FYI करें: django admin में 'कार्रवाई' ड्रॉप डाउन है जो सूची में किसी भी जाँच की गई पंक्तियों के लिए चैंजिस्ट दृश्य में लागू होती है।
टिम डिगिन्स

1
संबंधित (लेकिन अलग) प्रश्न: stackoverflow.com/questions/1721037/…
user9876

जवाबों:


342

यह आसान है, बस has_add_permissionअपनी Adminकक्षा में इस तरह अधिभार विधि :

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False

7
इसने मेरे लिए काम नहीं किया। "मॉडल जोड़ें" बटन अभी भी मॉडल के चैनल पेज पर दिखता है।
सेरिन

यहाँ MyAdmin क्या है?
user5319825

1
MyAdmin को पंजीकृत करना भी न भूलें: मॉडल के ऐप फ़ोल्डर admin.site.register(MyModel, MyModelAdmin)में सभी जोड़ें admin.py
djangonaut

और यही कारण है कि मैं पायथन और Django से बहुत प्यार करता हूं। सरल। बढ़िया काम किया। धन्यवाद!
dxhans5

2
Django 1.11 पर काम करता है। objपैरामीटर की आवश्यकता नहीं है ।
fjsj

9

डिफ़ॉल्ट रूप से syncdb प्रत्येक मॉडल के लिए 3 सुरक्षा अनुमतियाँ बनाता है:

  1. बनाएँ (उर्फ जोड़ें)
  2. परिवर्तन
  3. हटाएं

यदि आपके व्यवस्थापक के रूप में प्रवेश किया था, आपको मिल सब कुछ कोई बात नहीं क्या।

लेकिन यदि आप "सामान्य एक्सेस" (उदाहरण के लिए) नामक एक नया उपयोगकर्ता समूह बनाते हैं तो आप अपने सभी मॉडलों के लिए केवल CHANGE और DELETE अनुमतियाँ निर्दिष्ट कर सकते हैं।

फिर कोई भी लॉग इन किया गया उपयोगकर्ता जो उस समूह का सदस्य है, के पास "क्रिएट" अनुमति नहीं होगी, इससे संबंधित कुछ भी स्क्रीन पर नहीं दिखाई देगा।


7

मुझे लगता है कि यह आपकी मदद करेगा .. नीचे दिए गए कोड को admin.py file में होना चाहिए

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', )
    list_filter = ('name', )
    search_fields = ('name', )
    list_per_page = 20

    # This will help you to disbale add functionality
    def has_add_permission(self, request):
        return False

    # This will help you to disable delete functionaliyt
    def has_delete_permission(self, request, obj=None):
        return False

इसके बाद के संस्करण के रूप में additon में

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False

यह 2.2 के साथ काम करता है। और सुपरयूजर्स के लिए ऐड भी हटाएगा और बटन भी हटाएगा। वास्तव में मुझे क्या चाहिए।
एरिक कल्लोकेन

2

बस दूसरे उत्तर से कोड कॉपी करें

# In admin
# make the related field can't be added
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['service'].widget.can_add_related = False
        return form

मेरे मामले में मैं इनलाइन का उपयोग करता हूं

# In inline formset e.g. admin.TabularInline
# disable all
    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        service = formset.form.base_fields['service']
        service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
        return formset

में service = formset.form.base_fields['service'] base_fieldsमॉडल के रूप में परिभाषित क्षेत्रों है

यदि उपयोग में परिभाषित किया गया है:

product = formset.form.declared_fields['product']

यह सभी देखें


हां, base_fieldsऔर declared_fieldsइस मामले से मुझे सबसे महत्वपूर्ण खोज मिली।
CK

0

यह बहुत विलंबित उत्तर है; बस इसे पोस्ट करना जैसे कि कोई भी एक ही समाधान ढूंढ रहा है।

Admin.py फ़ाइल में आप निम्न कार्य कर सकते हैं:

class MyModelForm(forms.ModelForm):

class Meta:
    model = MyModel
    fields = '__all__'


class MyModelAdmin(admin.ModelAdmin):
    form = QuestionTrackAdminForm
    list_display = ['title', 'weight']
    readonly_fields = ['title', 'weight']

admin.site.register(MyModel, MyModelAdmin)

यहाँ, "readonly_fields" जादू करता है। धन्यवाद।


4
यह "ऐड" बटन को प्रदर्शित होने से नहीं रोकता है।
फ्लिम

यह समाधान केवल शीर्षक और वजन फ़ील्ड को प्रपत्र पर अक्षम कर देगा। यह एक नई MyModelAdmin ऑब्जेक्ट के निर्माण को नहीं रोक पाएगा, जो कि मेरा मानना ​​है कि ओपी पूछ रहा था।
dxhans5
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.