изменить ссылку отображения списка в django admin - PullRequest
21 голосов
/ 22 октября 2010

Я пытаюсь изменить ссылку для объекта в списке администратора django. Вот что у меня есть:

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>

Ответы [ 5 ]

28 голосов
/ 22 октября 2010

Решением было переопределить 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, )
24 голосов
/ 29 мая 2013

Я считаю, что правильный способ сделать это - создать подклассификатор ChangeList и переопределить метод url_for_result, чтобы создать нужный URL-адрес изменения.

Переопределить get_changelist в подклассе admin.ModelAdmin для возврата нового класса:

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
4 голосов
/ 23 октября 2017

По умолчанию в первом столбце отображения списка будет ссылка на страницу редактирования администратора. Если вы хотите, чтобы другой столбец или столбцы были этой ссылкой, очень простой способ выглядит следующим образом:

class FooModelAdmin(admin.ModelAdmin):
    list_display = ('foo_link', 'bar', 'another_bar', )
    list_display_links = ('foo_link', 'another_bar', )

Если foo_link не является свойством модели, оно должно вызываться следующим образом:

class FooModelAdmin(admin.ModelAdmin):
    list_display = ('foo_link', 'bar', 'another_bar', )
    list_display_links = ('foo_link', 'another_bar', )

    def foo_link(self, obj):
        return "%s blah blah" % obj.some_property # or anything you prefer e.g. an edit button

Полный пример из моего проекта:

class SchoolTeacherAdmin(admin.ModelAdmin):
    list_display = ('name', 'designation', 'school_name', 'school_code', 'date_of_birth', 'mobile', 'nid', 'edit', )
    list_display_links = ('edit', )

    def school_code(self, obj):
        return obj.school.code

    def school_name(self, obj):
        return obj.school.name.upper()

    def edit(self, obj):
        return "Edit"
1 голос
/ 10 сентября 2014

После того, как я сам следовал этой идее (чтобы перейти от отображения списка к реальной странице), у меня возникли вторые мысли. Есть две страницы, которые вы должны рассмотреть: страница администратора модели и фактическая общедоступная страница (возможно, подробный вид) модели. Если вы переходите от администратора к общедоступной странице (даже если это страница CMS), вы теряете соединение с ее страницей администратора.

Страница администратора модели фактически ссылается на общедоступную страницу через ссылку «Предварительный просмотр» (регулярно размещается в правом верхнем углу). Эта ссылка происходит от model_object.get_absolute_url().

Итак, если вы хотите изменить место ссылки предварительного просмотра, вам просто нужно переопределить get_absolute_url(). И в этом случае, вероятно, в любом случае, это хорошая вещь, потому что вы, вероятно, захотите использовать этот URL-адрес и во всех других местах.

0 голосов
/ 22 октября 2010

Вам необходимо переопределить шаблон, так как ссылка там обернута. Взгляните на Редактировать шаблон администратора Django User .

...