Django

2009-10-14 17 views
16

में डिफॉल्ट "चयनित हटाएं" व्यवस्थापक कार्रवाई डिफ़ॉल्ट रूप से Django व्यवस्थापक पैनल में डिफ़ॉल्ट व्यवस्थापक कार्रवाई "चयनित एक्स आइटम हटाएं" के वर्बोज़ नाम को कैसे हटा या बदल सकता है?Django

उत्तर

12

सुनिश्चित नहीं हैं कि अगर बंदर पैचिंग की इस तरह एक अच्छा विचार है, लेकिन मेरे लिए मेरी admin.py कार्यों में से एक में यह धकेल:

from django.contrib.admin.actions import delete_selected 
delete_selected.short_description = u'How\'s this for a name?' 

यह सभी अपने व्यवस्थापक साइटों के लिए वर्बोज़ नाम बदल जाएगा । यदि आप इसे केवल एक विशेष मॉडल के व्यवस्थापक के लिए बदलना चाहते हैं, तो मुझे लगता है कि आपको custom admin action लिखना होगा।

Django संस्करण 1.1 के साथ परीक्षण किया गया:

>>> import django 
>>> django.VERSION 
(1, 1, 0, 'beta', 1) 
+0

यह नहीं है मेरे लिए एक चालाक रास्ता लगता है काम। यह बस एक्शन बॉक्स को हटा देता है। – Hellnar

+1

हू। मैंने Django 1.1 के साथ इसका परीक्षण किया और यह ठीक काम करता है। मैंने इसे अपने admin.py के शीर्ष पर (अन्य आयात विवरणों के नीचे) रखा है। –

+0

यह मेरे लिए (1, 1, 0, 'अंतिम', 0) है, शायद यही कारण है :( – Hellnar

19

आप इस कोड के साथ प्रदर्शित होने से कार्रवाई निष्क्रिय कर सकते हैं।

from django.contrib import admin 
admin.site.disable_action('delete_selected') 

यदि आप चुना है, तो आप उसे अलग-अलग मॉडल पर इस के साथ बहाल कर सकते हैं:

class FooAdmin(admin.ModelAdmin): 
    actions = ['my_action', 'my_other_action', admin.actions.delete_selected] 
+0

यह शानदार है - बढ़िया काम करता है। – Mark

+0

admin.actions.delete_selected के बजाय 'delete_selected' का उपयोग करके Django 1.6 में ठीक काम करता है। –

4

आदेश में delete_selected की जगह मैं निम्न कार्य करें:

को कॉपी समारोह delete_selectedcontrib/admin/actions.py से आपका admin.py और इसका नाम बदलें। टेम्पलेट contrib/admin/templates/delete_selected_confirmation.html को अपनी टेम्पलेट निर्देशिका में कॉपी करें और उसका नाम बदलें। मेरा इस तरह दिखता है:

def reservation_bulk_delete(modeladmin, request, queryset): 
    """ 
    Default action which deletes the selected objects. 
    This action first displays a confirmation page whichs shows all the 
    deleteable objects, or, if the user has no permission one of the related 
    childs (foreignkeys), a "permission denied" message. 

    Next, it delets all selected objects and redirects back to the change list. 
    """ 
    opts = modeladmin.model._meta 
    app_label = opts.app_label 

    # Check that the user has delete permission for the actual model 
    if not modeladmin.has_delete_permission(request): 
     raise PermissionDenied 

    # Populate deletable_objects, a data structure of all related objects that 
    # will also be deleted. 

    # deletable_objects must be a list if we want to use '|unordered_list' in the template 
    deletable_objects = [] 
    perms_needed = set() 
    i = 0 
    for obj in queryset: 
     deletable_objects.append([mark_safe(u'%s: <a href="%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), obj.pk, escape(obj))), []]) 
     get_deleted_objects(deletable_objects[i], perms_needed, request.user, obj, opts, 1, modeladmin.admin_site, levels_to_root=2) 
     i=i+1 

    # The user has already confirmed the deletion. 
    # Do the deletion and return a None to display the change list view again. 
    if request.POST.get('post'): 
     if perms_needed: 
      raise PermissionDenied 
     n = queryset.count() 
     if n: 
      for obj in queryset: 
       obj_display = force_unicode(obj) 

       obj.delete() 

       modeladmin.log_deletion(request, obj, obj_display) 
      #queryset.delete() 
      modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { 
       "count": n, "items": model_ngettext(modeladmin.opts, n) 
      }) 
     # Return None to display the change list page again. 
     return None 

    context = { 
     "title": _("Are you sure?"), 
     "object_name": force_unicode(opts.verbose_name), 
     "deletable_objects": deletable_objects, 
     'queryset': queryset, 
     "perms_lacking": perms_needed, 
     "opts": opts, 
     "root_path": modeladmin.admin_site.root_path, 
     "app_label": app_label, 
     'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 
    } 

    # Display the confirmation page 
    return render_to_response(modeladmin.delete_confirmation_template or [ 
     "admin/%s/%s/reservation_bulk_delete_confirmation.html" % (app_label, opts.object_name.lower()), 
     "admin/%s/reservation_bulk_delete_confirmation.html" % app_label, 
     "admin/reservation_bulk_delete_confirmation.html" 
    ], context, context_instance=template.RequestContext(request)) 

आप देख सकते हैं मैं बाहर

queryset.delete() 

टिप्पणी की है और नहीं बल्कि का उपयोग करें:

obj.delete() 

अभी तक इष्टतम नहीं है यही कारण है कि - यदि आप संपूर्ण क्वेरीसमूह के लिए कुछ आवेदन करना चाहिए बेहतर प्रदर्शन के लिए। जहां जरूरत

admin.site.disable_action('delete_selected') 

इसके बजाय मैं अपने खुद के समारोह का उपयोग करें::

admin.py में मैं डिफ़ॉल्ट कार्रवाई पूरे व्यवस्थापक साइट के लिए delete_selected को निष्क्रिय

class ReservationAdmin(admin.ModelAdmin): 
    actions = [reservation_bulk_delete, ] 

अपने मॉडल में मैं delete() को परिभाषित समारोह:

class Reservation(models.Model): 
    def delete(self): 
     self.status_server = RESERVATION_STATUS_DELETED 
     self.save() 
23

वैकल्पिक रूप से गूगोल के समाधान के लिए, और delete_model() से be implemented in current Django version के लिए प्रतीक्षा करके, मैं निम्नलिखित कोड का सुझाव देता हूं।

यह केवल वर्तमान AdminForm के लिए डिफ़ॉल्ट हटाए गए क्रिया को अक्षम करता है।

class FlowAdmin(admin.ModelAdmin): 
    actions = ['delete_model'] 

    def get_actions(self, request): 
     actions = super(MyModelAdmin, self).get_actions(request) 
     del actions['delete_selected'] 
     return actions 

    def delete_model(self, request, obj): 
     for o in obj.all(): 
      o.delete() 
    delete_model.short_description = 'Delete flow' 

admin.site.register(Flow, FlowAdmin) 
+1

'delete_model' का उपयोग नहीं किया जाना चाहिए, क्योंकि इस विधि का उपयोग व्यवस्थापक से एक उदाहरण को हटाते समय किया जाता है। उस स्थिति में क्वेरीसेट तर्क एक क्वेरीसेट नहीं है, यह एक उदाहरण है, और यह लूप क्रैश बनाता है। – jul

+0

इसे स्वीकृत उत्तरकर्ता के रूप में चुना जाना चाहिए। –

+0

मैं django 1.4.16 का उपयोग कर रहा हूं और 'delete_model' दोनों मामलों में काम नहीं करता है (कोई अपवाद या लूप नहीं)। – Paolo

3

विश्व स्तर पर बदलते delete_selected के SHORT_DESCRIPTION लिए Dominic Rodger के answer सबसे अच्छा लगता है।

हालांकि एक मॉडल के लिए व्यवस्थापक का SHORT_DESCRIPTION को बदलने के लिए मुझे लगता है कि Stéphane के answer को यह विकल्प बेहतर है:

def get_actions(self, request): 
    actions = super(MyModelAdmin, self).get_actions(request) 
    actions['delete_selected'][0].short_description = "Delete Selected" 
    return actions 
0
from django.contrib.admin import sites 
from django.contrib.admin.actions import delete_selected 


class AdminSite(sites.AdminSite): 
    """ 
    Represents the administration, where only authorized users have access. 
    """ 
    def __init__(self, *args, **kwargs): 
     super(AdminSite, self).__init__(*args, **kwargs) 
     self.disable_action('delete_selected') 
     self.add_action(self._delete_selected, 'delete_selected') 

    @staticmethod 
    def _delete_selected(modeladmin, request, queryset): 
     _delete_qs = queryset.delete 

     def delete(): 
      for obj in queryset: 
       modeladmin.delete_model(request, obj) 
      _delete_qs() 

     queryset.delete = delete 
     return delete_selected(modeladmin, request, queryset) 
0
class FooAdmin(sites.AdminSite): 
     not_deleted = ['value1', 'value2'] 
     actions = ['delete_selected_values'] 

    def delete_selected_values(self, request, queryset): 
     # my custom logic 
     exist = queryset.filter(value__in=self.not_deleted).exists() 
     if exist: 
      error_message = "Error" 
      self.message_user(request, error_message, level=messages.ERROR) 
     else: 
      delete_action = super().get_action('delete_selected')[0] 
      return delete_action(self, request, queryset) 
    delete_selected_values.short_description = 'delete selected' 

admin.site.register(Foo, FooAdmin) 
+1

स्टैक ओवरव्लो में आपका स्वागत है! कृपया, अपना कोड टिप्पणी करें – tutankhamun