Django Admin: How to access the request object in admin.py, for list_display methods?

后端 未结 9 1714
太阳男子
太阳男子 2020-12-13 14:30

I\'ve added a method highlight_link to my model\'s admin.py class:

class RadioGridAdmin(admin.ModelAdmin):
    
    list_display = (\'start_time\         


        
9条回答
  •  爱一瞬间的悲伤
    2020-12-13 15:15

    Described how to refactor this into a mixin, with addition of the thread-safety bit based on @taha-jahangir's answer. Here's the mixin:

    import threading
    
    class ModelAdminRequestMixin(object):
        def __init__(self, *args, **kwargs):
            # let's define this so there's no chance of AttributeErrors
            self._request_local = threading.local()
            self._request_local.request = None
            super(ModelAdminRequestMixin, self).__init__(*args, **kwargs)
    
        def get_request(self):
            return self._request_local.request
    
        def set_request(self, request):
            self._request_local.request = request
    
        def changeform_view(self, request, *args, **kwargs):
            # stash the request
            self.set_request(request)
    
            # call the parent view method with all the original args
            return super(ModelAdminRequestMixin, self).changeform_view(request, *args, **kwargs)
    
        def add_view(self, request, *args, **kwargs):
            self.set_request(request)
            return super(ModelAdminRequestMixin, self).add_view(request, *args, **kwargs)
    
        def change_view(self, request, *args, **kwargs):
            self.set_request(request)
            return super(ModelAdminRequestMixin, self).change_view(request, *args, **kwargs)
    
        def changelist_view(self, request, *args, **kwargs):
            self.set_request(request)
            return super(ModelAdminRequestMixin, self).changelist_view(request, *args, **kwargs)
    
        def delete_view(self, request, *args, **kwargs):
            self.set_request(request)
            return super(ModelAdminRequestMixin, self).delete_view(request, *args, **kwargs)
    
        def history_view(self, request, *args, **kwargs):
            self.set_request(request)
            return super(ModelAdminRequestMixin, self).history_view(request, *args, **kwargs)
    

    Subclass ModelAdmin with the mixin:

    class PollAdmin(ModelAdminRequestMixin, admin.ModelAdmin):
        pass
    

    ... and you can just call self.get_request() from any method.

提交回复
热议问题