In Djangos ModelAdmin wollte ich in der Lage sein, ein Element mit list_display mit der Detailseite für dieses Element zu verknüpfen.
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.
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 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.
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