Django Admin: Как получить доступ к объекту запроса в admin.py, для методов list_display?
Я добавил метод 'highlight_link' к моему классу класс admin.py:
class RadioGridAdmin(admin.ModelAdmin):
list_display = ('start_time', highlight_link)
def highlight_link(self):
return ('some custom link')
admin.site.register(RadioGrid, RadioGridAdmin)
Он возвращает настраиваемую ссылку для (я оставил highlight_link.short_description для краткости) каждую запись, возвращенную в списке изменений. Это здорово. Но я хотел бы проверить текущую строку запроса и изменить ее на основе этой ссылки. Есть ли способ получить доступ к объекту Request в 'highlight_link'?
Ответы
Ответ 1
Я попробовал другие ответы, оставленные здесь, и столкнулся с проблемами, которые для меня были сложными. Я играл с def __call__()
и придумал следующее. Возможно, это неправильный способ сделать это, но он работает...
возьмите здесь переменную GET (все в классе RadioGridAdmin, как описано выше в моем первоначальном сообщении):
def __call__(self, request, url):
global start_date
start_date = request.GET['param']
return super(RadioGridAdmin, self).__call__(request, url)
и поскольку он глобальный, вы можете получить к нему доступ здесь:
def highlight_link(self):
# access start_date here
Ответ 2
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)
Ответ 3
Я решаю свою проблему таким образом.
class MyClassAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(MyClassAdmin, self).queryset(request)
self.request = request
return qs
Теперь я могу использовать self.request
в любом месте
UPDATE
Изменено в Django 1.6: Метод get_queryset ранее был назван queryset.
class MyClassAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyClassAdmin, self).get_queryset(request)
self.request = request
return qs
Ответ 4
Нет прямого пути для этого. Я вижу два возможных решения.
-
Использовать хранилище локальных потоков для одного объекта запроса
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')
-
Если вы используете простую не-поточную установку Django, можно сохранить объект запроса как атрибут:
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')
Ответ 5
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()
# ...
Ответ 6
Что не так с этим:
def highlight_link(self, request):
# access start_date here