theme template personalizar actions django django-admin request

template - django admin theme



Administrador de Django: ¿Cómo acceder al objeto de solicitud en admin.py, para los métodos de list_display? (6)

He agregado un método ''highlight_link'' a la clase admin.py de mi modelo:

class RadioGridAdmin(admin.ModelAdmin): list_display = (''start_time'', highlight_link) def highlight_link(self): return (''some custom link'') admin.site.register(RadioGrid, RadioGridAdmin)

Devuelve un enlace personalizado para (he omitido highlight_link.short_description para abreviar) cada registro devuelto en la lista de cambios. Lo cual es genial. Pero me gustaría inspeccionar la cadena de consulta actual y cambiar el enlace personalizado en función de eso. ¿Hay alguna manera de acceder al objeto Request dentro de ''highlight_link''?


¿Qué pasa con esto?

def highlight_link(self, request): # access start_date here


No es una forma directa de lograr esto. Veo 2 posibles soluciones

  • Utilice un almacén local de subprocesos para el mismo objeto de solicitud

    from django.utils._threading_local import locals globals = locals() class RadioGridAdmin(admin.ModelAdmin): def __call__(self, request, *args, **kwargs): globals[''radio_grid_admin_request''] = request return super(RadioGridAdmin, self).__call__(request, *args, **kwargs) def highlight_link(self): request = globals[''radio_grid_admin_request''] # request.GET processing return (''some custom link'')

  • Si está utilizando una instalación simple de Django sin hilos, es posible guardar el objeto de solicitud solo como atributo:

    class RadioGridAdmin(admin.ModelAdmin): def __call__(self, request, *args, **kwargs): self.request = request return super(RadioGridAdmin, self).__call__(request, *args, **kwargs) def highlight_link(self): # self.request.GET processing return (''some custom link'')


Probé las otras respuestas que quedaron aquí y encontré problemas que, para mí, se estaban volviendo complejos. def __call__() con def __call__() y se me ocurrió lo siguiente. Probablemente esta no sea la forma correcta de hacerlo, pero funciona ...

tomar la variable GET aquí (todo dentro de la clase RadioGridAdmin como se describe arriba en mi publicación inicial):

def __call__(self, request, url): global start_date start_date = request.GET[''param''] return super(RadioGridAdmin, self).__call__(request, url)

y dado que es global, ahora puedes acceder a él aquí:

def highlight_link(self): # access start_date here


Resuelvo mi problema de esta manera.

class MyClassAdmin(admin.ModelAdmin): def queryset(self, request): qs = super(MyClassAdmin, self).queryset(request) self.request = request return qs

Ahora puedo usar self.request en cualquier lugar

ACTUALIZAR

Modificado en Django 1.6: El método get_queryset anteriormente se llamaba queryset.

class MyClassAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super(MyClassAdmin, self).get_queryset(request) self.request = request return qs


class RadioGridAdmin(admin.ModelAdmin): def highlight_link(self, obj): return (self.param) def changelist_view(self, request, extra_context=None): self.param = request.GET[''param''] return super(RadioGridAdmin,self).changelist_view(request, extra_context=extra_context)


import threading _thread_local = threading.local() def get_thread_local_request(): return getattr(_thread_local, "request", None) class RadioGridAdmin(admin.ModelAdmin): list_display = (''display_field'', ...) def display_field(self, obj): # ... request = get_thread_local_request() # ...