[PYTHON] Lier l'élément list_display dans l'Admin Model de Django

Ce que je voulais faire

Dans ModelAdmin de Django, je voulais pouvoir lier un élément avec list_display à la page de détail de cet élément.

Comment faire de l'élément de list_display un lien

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.

référence

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

Remarque: restez coincé dans mypy

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.

Solution

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

Lier l'élément list_display dans l'Admin Model de Django
Faire de n'importe quelle clé la clé primaire dans le modèle Django
Personnalisez la page modèle de l'écran d'administration de Django
Avantages de l'utilisation de slugfield dans le modèle Django
Comment afficher les images dans l'administration de Django
Recherchez vous-même à partir des méthodes du modèle de Django
Implémentez la fonction de saisie semi-automatique sur l'écran d'administration de Django
Spécifier le modèle d'éclairage du matériau SCN dans Pythonista
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
Comment utiliser la clause exist dans l'ensemble de requêtes Django
Comment utiliser le modèle appris dans Lobe en Python