Подтвердить что ты не робот

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'?

4b9b3361

Ответ 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