Dans ModelAdmin de Django, je voulais pouvoir lier un élément avec list_display à la page de détail de cet élément.
Par exemple, supposons que le code avant la liaison ressemble à ceci.
from django.contrib import admin
class FooModelAdmin(admin.ModelAdmin):
list_display = ('foo','bar')
Dans le code ci-dessus, si vous souhaitez lier "toto" dans list_display, procédez comme suit.
from django.contrib import admin
from django.utils.safestring import mark_safe
class FooModelAdmin(admin.ModelAdmin):
list_display = ('foo','bar')
def foo_link(self, obj):
return mark_safe(
f'<a href="/foo/{obj.pk}/">{obj.foo}</a>'
)
foo_link.short_description = "foo"
foo_link.admin_order_field = "foo"
En définissant foo_link.short_description =" foo "
, il est possible d'afficher foo au lieu de foo_link.
De plus, en définissant foo_link.admin_order_field =" foo "
, vous pouvez trier par toto.
Je pense que vous pouvez créer un lien comme celui-ci. Veuillez commenter si vous avez des erreurs ou une meilleure rédaction.
https://stackoverflow.com/questions/3998786/change-list-display-link-in-django-admin https://stackoverflow.com/questions/47953705/how-do-i-use-allow-tags-in-django-2-0-admin/47953774
Mypy renvoie une erreur pour la partie suivante du code ci-dessus.
foo_link.short_description = "foo"
foo_link.admin_order_field = "foo"
error: "Callable[[FooModelAdmin, Any], str]" has no attribute "short_description"
error: "Callable[[FooModelAdmin, Any], str]" has no attribute "admin_order_field"
C'est une erreur comme celle-ci.
Après examen, ce problème semble être un bogue dans mypy, et bien qu'il ait été un peu discuté sur github, il semble difficile à résoudre.
À l'heure actuelle, il semble qu'il n'y ait pas d'autre choix que d'ajouter # type: ignore
à la fin de la phrase et de laisser mypy ignorer la vérification de type.
from django.contrib import admin
from django.utils.safestring import mark_safe
class FooModelAdmin(admin.ModelAdmin):
list_display = ('foo','bar')
def foo_link(self, obj):
return mark_safe(
f'<a href="/foo/{obj.pk}/">{obj.foo}</a>'
)
foo_link.short_description = "foo" # type: ignore
foo_link.admin_order_field = "foo" # type: ignore
L'écriture de cette façon élimine les erreurs mypy.
Recommended Posts