Ссылка на список изменений в django admin
Я пытаюсь изменить ссылку для объекта на дисплее списка администратора 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>
Ответы
Ответ 1
Решение заключалось в том, чтобы переопределить 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, )
Ответ 2
Я верю, что это правильный способ: подклассифицировать 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
Ответ 3
Вам нужно переопределить шаблон, так как ссылка там завернута. Посмотрите Редактировать шаблон администратора пользователя Django.
Ответ 4
После того, как я сам это сделал (чтобы перейти от отображения списка к фактической странице), я подумал. Есть две страницы, которые вы должны учитывать: страницу администратора модели и фактическую общедоступную страницу (возможно, подробное представление) модели. Если вы связываетесь с администратором на общедоступную страницу (даже если это страница CMS), вы теряете соединение со своей страницей администратора.
Страница администрирования модели фактически ссылается на общедоступную страницу через ссылку "Предварительный просмотр" (регулярно размещается в верхнем правом углу). Эта ссылка происходит от model_object.get_absolute_url()
.
Итак, если вы хотите изменить, где точки ссылки предварительного просмотра вы просто должны переопределить get_absolute_url()
. И в этом случае, вероятно, хорошо, что вы это делаете, во всяком случае, потому что вы, скорее всего, захотите использовать этот URL-адрес и во всех других местах.
Ответ 5
По умолчанию первая опция отображения списка будет ссылкой на экран редактирования. Если вам нужен другой столбец или столбцы, это очень простой способ:
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"