Django Admin Application: Creating a Dynamic List of Admin Actions

I am trying to dynamically build a list of admin actions using the get_actions()on method ModelAdmin. Each action refers to a specific instance of another model, and since new instances can be added or removed, I want to make sure that the list of actions reflects this.

Here ModelAdmin:

class PackageAdmin(admin.ModelAdmin):
    list_display = ('name', 'quality')

    def _actions(self, request):
        for q in models.Quality.objects.all():
            action = lambda modeladmin, req, qset: qset.update(quality=q)
            name = "mark_%s" % (q,)
            yield (name, (action, name, "Mark selected as %s quality" % (q,)))

    def get_actions(self, request):
        return dict(action for action in self._actions(request))

(The strange duplicate return value of tuples is explained by Django docs forget_actions() .)

As expected, this leads to a list of the corresponding administrator action names for the mass assignment of foreign keys Qualityfor objects Package.

, , , Quality Package s.

, , lambda, q, q .

, , q?


: , lambda . :

action = lambda modeladmin, req, qset: qset.update(quality=q)

def:

def action(modeladmin, req, qset):
    return qset.update(quality=q)
+3
3

   def make_action(quality):
        return lambda modeladmin, req, qset: qset.update(quality=quality)

   for q in models.Quality.objects.all():
       action = make_action(q)
       name = "mark_%s" % (q,)
       yield (name, (action, name, "Mark selected as %s quality" % (q,)))

, , yield. , :

def make_action(quality):
    name = 'mark_%s' % quality
    action = lambda modeladmin, req, qset: qset.update(quality=quality)
    return (name, (action, name, "Mark selected as %s quality" % quality))

def get_actions(self, request):
    return dict([make_action for q in models.Quality.objects.all()])
+5

andylei, ; , , , , Quality.

def create_action(quality):
    fun = lambda modeladmin, request, queryset: queryset.update(quality=quality)
    name = "mark_%s" % (quality,)
    return (name, (fun, name, "Mark selected as %s quality" % (quality,)))

class PackageAdmin(admin.ModelAdmin):
    list_display = ('name', 'quality')

    def get_actions(self, request):
        return dict(create_action(q) for q in models.Quality.objects.all())
+1

I am surprised that q remains the same object inside the loop.

Does it work with quality=q.idin your lambda?

0
source

Source: https://habr.com/ru/post/1725639/


All Articles