26

django admin リスト表示のオブジェクトのリンクを変更しようとしています。これが私がこれまでに持っているものです:

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

    def foo_link(self,obj):
        return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj)
    domain_link.allow_tags = True
    domain_link.short_description = "foo"

これにより、元のリスト表示リンク内に別のリンクが生成されます。

<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a>
4

6 に答える 6

34

解決策は、initをオーバーライドし、list_display_linksをNoneに設定することでした。

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

    def foo_link(self,obj):
        return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj)
    foo_link.allow_tags = True
    foo_link.short_description = "foo"
    def __init__(self,*args,**kwargs):
        super(FooModelAdmin, self).__init__(*args, **kwargs)
        self.list_display_links = (None, )
于 2010-10-22T17:37:29.383 に答える
31

それを行う正しい方法は、ChangeListをサブクラス化し、url_for_resultメソッドをオーバーライドして、必要な正しい変更URLを作成することだと思います。

admin.ModelAdmin サブクラスの get_changelist をオーバーライドして、新しいクラスを返します。

from django.contrib.admin.views.main import ChangeList
from django.contrib.admin.util import quote

class FooChangeList(ChangeList):
    def url_for_result(self, result):
        pk = getattr(result, self.pk_attname)
        return '/foos/foo/%d/' % (quote(pk))

class FooAdmin(admin.ModelAdmin):
    def get_changelist(self, request, **kwargs):
        return FooChangeList
于 2013-05-29T19:10:55.310 に答える
1

このアイデア (リスト表示から実際のページへのリンク) に従ってから、考え直しました。考慮しなければならないページが 2 つあります。モデルの管理ページと、モデルの実際の公開ページ (おそらく詳細ビュー) です。管理ページから公開ページにリンクすると (CMS ページであっても)、管理ページへの接続が失われます。

モデルの管理ページは、実際には「プレビュー」リンク (通常は右上に配置されています) を介して公開ページにリンクしています。このリンクは から派生していmodel_object.get_absolute_url()ます。

そのため、プレビュー リンクが指す場所を変更したい場合は、単にオーバーライドする必要がありますget_absolute_url()。この場合、他のすべての場所でもその URL を利用したいと思う可能性が高いため、とにかくそうすることはおそらく良いことです。

于 2014-09-10T17:54:13.620 に答える
0

リンクはそこでラップされているため、テンプレートをオーバーライドする必要があります。Edit DjangoUseradmintemplateをご覧ください。

于 2010-10-22T17:38:08.323 に答える