[PYTHON] Verknüpfen Sie das Element list_display in Djangos Model Admin

Was ich machen wollte

In Djangos ModelAdmin wollte ich in der Lage sein, ein Element mit list_display mit der Detailseite für dieses Element zu verknüpfen.

So machen Sie das Element list_display zu einem Link

Angenommen, der Code vor dem Verknüpfen sieht folgendermaßen aus.

from django.contrib import admin

class FooModelAdmin(admin.ModelAdmin):
    list_display = ('foo','bar')

Gehen Sie im obigen Code wie folgt vor, wenn Sie 'foo'in list_display verlinken möchten.

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"

Durch Setzen von foo_link.short_description =" foo " ist es möglich, foo anstelle von foo_link anzuzeigen. Wenn Sie foo_link.admin_order_field =" foo " setzen, können Sie auch nach foo sortieren.

Ich denke, Sie können einen Link wie diesen erstellen. Bitte kommentieren Sie, wenn Sie Fehler haben oder besser schreiben.

Referenz

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

Hinweis: Bleiben Sie in mypy stecken

Mypy gibt einen Fehler für den folgenden Teil des obigen Codes aus.

    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"

Dies ist ein Fehler wie dieser.

Lösung

Bei der Untersuchung scheint dieses Problem ein Fehler in mypy zu sein, und obwohl es auf Github ziemlich viel diskutiert wurde, scheint es schwierig zu lösen. Derzeit scheint es keine andere Wahl zu geben, als am Ende des Satzes "# type: ignore" hinzuzufügen und mypy die Typprüfung ignorieren zu lassen.

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

Wenn Sie auf diese Weise schreiben, werden Mypy-Fehler beseitigt.

Recommended Posts

Verknüpfen Sie das Element list_display in Djangos Model Admin
Machen Sie einen beliebigen Schlüssel zum Primärschlüssel im Django-Modell
Passen Sie die Modellseite des Django-Verwaltungsbildschirms an
Vorteile der Verwendung von Slugfield im Django-Modell
So zeigen Sie Bilder in Djangos Admin an
Suchen Sie selbst anhand der Methoden in Djangos Modell
Implementieren Sie die Autovervollständigungsfunktion auf dem Django-Verwaltungsbildschirm
Geben Sie das Beleuchtungsmodell für SCN-Material in Pythonista an
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Verwendung der Exist-Klausel in Django Queryset
Verwendung des in Lobe in Python erlernten Modells