0
I tried the other answers left here and ran into issues that for me, were getting complex. I played around with def __call__()
and came up with the following. This probably isnβt the correct way to do this, but it worksβ¦
grab the GET variable here (all within class RadioGridAdmin as described above in my initial post):
def __call__(self, request, url):
global start_date
start_date = request.GET['param']
return super(RadioGridAdmin, self).__call__(request, url)
and since itβs global, you can now access it here:
def highlight_link(self):
# access start_date here
34
I solve my issue this way (for django under 1.7):
class MyClassAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(MyClassAdmin, self).queryset(request)
self.request = request
return qs
Now i can use self.request
in any place
UPDATE
Changed in Django 1.6:
The get_queryset method was previously named queryset.
class MyClassAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyClassAdmin, self).get_queryset(request)
self.request = request
return qs
- [Django]-How to get the label of a choice in a Django forms ChoiceField?
- [Django]-Install mysql-python (Windows)
- [Django]-How can I make a trailing slash optional on a Django Rest Framework SimpleRouter
20
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)
- [Django]-How do I get multiple values from checkboxes in Django
- [Django]-How to use csrf_token in Django RESTful API and React?
- [Django]-Django rest framework: set field-level error from serializer validate() method
6
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.
- [Django]-Get list item dynamically in django templates
- [Django]-Django Rest Framework β APIView Pagination
- [Django]-Checking the number of elements in an array in a Django template
5
Small code clarify for Diego Puente answer (python 3.6):
class MyClassAdmin(admin.ModelAdmin):
def __init__(self, model, admin_site):
self.request = None
super().__init__(model, admin_site)
def get_queryset(self, request):
self.request = request
return super().get_queryset(request)
So you can get self.request
from any other method of MyClassAdmin
.
If define self.request
in get_queryset
method (without declaring it in __init__
) PyCharm will generate warning Instance attribute attribute_name defined outside __init__
.
- [Django]-Log in user using either email address or username in Django
- [Django]-How to change User representation in Django Admin when used as Foreign Key?
- [Django]-How to use "select_for_update()" to get an object in Django?
3
The is no direct way to accomplish this. I see 2 possible solutions.
-
Use a thread locals store to same request object
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')
-
If you are using simple non-threaded Django installation it is possible to save request object just as attribute:
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')
- [Django]-Cron and virtualenv
- [Django]-Django β create a unique database constraint for 2 or more fields together
- [Django]-How to upload multiple files in django rest framework
3
This is edited version of @user27478 answer, which uses thread-local vars:
class RadioGridAdmin(admin.ModelAdmin):
def __init__(self, model, admin_site):
super().__init__(model, admin_site)
self._request_local = threading.local()
def changelist_view(self, request, extra_context=None):
self._request_local.request = request
return super().changelist_view(request, extra_context)
@property
def _request(self):
return self._request_local.request
def example_highlight_link(self, obj):
changelist = self.get_changelist_instance(self._request)
url = changelist.get_query_string(new_params={'key1': 1})
- [Django]-Django TextField and CharField is stripping spaces and blank lines
- [Django]-How do I pass template context information when using HttpResponseRedirect in Django?
- [Django]-Running fabric script locally
0
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()
# ...
- [Django]-How to make Django template engine to render in memory templates?
- [Django]-Django: How can I create a multiple select form?
- [Django]-How do I use an UpdateView to update a Django Model?
0
admin_mixins.py
from functools import partial, update_wrapper, lru_cache
# Django admin call 2 times get_list_display.
# We need to return the same function to make the method sortable using 'admin_order_field'
# https://github.com/django/django/blob/2161db0792f2e4d3deef3e09cd72f7a08340cafe/django/contrib/admin/templatetags/admin_list.py#L84
@lru_cache(maxsize=100)
def cache_display_wrap(f, request):
wf = partial(f, request)
nf = update_wrapper(wf, f)
return nf
class ModelAdminMixin(admin.ModelAdmin):
def get_list_display(self, request):
def check_needs_request(display):
f = getattr(self, display, None) if not callable(display) else display
if f and getattr(f, 'needs_request', False):
return cache_display_wrap(f, request)
return display
return [check_needs_request(display) for display in super().get_list_display(request)]
any_app/admin.py
from django.contrib import admin
from core.admin_mixins import ModelAdminMixin
@admin.register(AnyModel)
class AnyModelAdmin(ModelAdminMixin, admin.ModelAdminMixin):
list_display = ['id', 'especial_display_with_request']
def especial_display_with_request(self, request, obj):
# Make something special with the request
return obj.any_field
especial_display_with_request.needs_request = True # Similar to short_description or any other django admin attr.
Source: https://gist.github.com/pricco/24826bae3d5102d963eb13ecc0493f33
- [Django]-Why does my Django admin site not have styles / CSS loading?
- [Django]-Django select_related β when to use it
- [Django]-Django ORM and locking table
- [Django]-How to update() a single model instance retrieved by get() on Django ORM?
- [Django]-How to mock users and requests in django
- [Django]-Django Unit Testing taking a very long time to create test database