Django Admin: Comment accéder à l'objet de la requête en admin.py pour list_display méthodes?
J'ai ajouté une méthode 'highlight_link" pour mon modèle admin.py catégorie:
class RadioGridAdmin(admin.ModelAdmin):
list_display = ('start_time', highlight_link)
def highlight_link(self):
return ('some custom link')
admin.site.register(RadioGrid, RadioGridAdmin)
Elle renvoie un lien personnalisé pour (je l'ai laissé de côté highlight_link.short_description par souci de concision) chaque enregistrement retourné dans la liste des changements. Ce qui est génial. Mais je tiens à inspecter la chaîne de requête et modifier le lien sur cette base. Est-il un moyen d'accéder à la Demande de l'objet à l'intérieur des "highlight_link'?
- Je tiens à souligner ce billet: code.djangoproject.com/ticket/13659
Vous devez vous connecter pour publier un commentaire.
- Je résoudre mon problème de cette façon.
Maintenant je peux utiliser
self.request
en tout lieuMise à JOUR
queryset
doit maintenant être remplacé parget_queryset
.queryset
doit maintenant être remplacé parget_queryset
.L'est pas de manière directe de l'accomplir. Je vois 2 solutions possibles.
Utiliser un fil les habitants de magasin pour le même objet de demande
Si vous êtes en utilisant de simples non filetée Django installation, il est possible d'enregistrer la demande d'objet comme attribut:
__call__
méthode invoquée avec unerequest
argument sur unModelAdmin
exemple? Je ne vois nulle part dans Django du code.django.utils._threading_local
Petit code de clarifier pour Diego Puente réponse (python 3.6):
De sorte que vous pouvez obtenir
self.request
de toute autre méthode deMyClassAdmin
.Si définir
self.request
dansget_queryset
méthode (sans les déclarer dans__init__
) PyCharm va générer avertissementInstance attribute attribute_name defined outside __init__
.Décrit comment refactoriser ce dans un mixin, avec l'ajout de la fil-sécurité bits, basé sur @taha-jahangir de réponse. Voici le mixin:
Sous-classe ModelAdmin avec le mixin:
... et vous pouvez les appeler
self.get_request()
à partir de n'importe quelle méthode.J'ai essayé les autres réponses de gauche ici et a couru dans les questions qui pour moi, ont été l'obtention de complexes. J'ai joué un peu avec
def __call__()
et est venu avec ce qui suit. Ce n'est probablement pas la bonne façon de le faire, mais ça fonctionne...saisir la variable OBTENIR ici (tous au sein de la classe RadioGridAdmin comme décrit ci-dessus dans mon post initial):
et depuis qu'il est international, vous pouvez maintenant accéder ici:
from django.core import get_thread_local_request
donneImportError: cannot import name 'get_thread_local_request'
. Toute aide?C'est la version éditée de @user27478 réponse, qui utilise des threads locaux vars:
Quel est le problème avec ceci:
request
n'est pas l'un d'eux. Juste de l'ajouter à la signature de la méthode ne change pas la façon dont il est appelé.