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()
# ...