Внешние ключи в django администраторе перечисляют дисплей

Если django модель содержит поле внешнего ключа, и если то поле показывают в режиме списка, то это обнаруживается как текст, вместо того, чтобы отобразить ссылку на внешний объект.

Действительно ли возможно автоматически отобразить все внешние ключи как ссылки вместо плоского текста?

(конечно, это возможно сделать это на поле полевым основанием, но является там общим методом?)

Пример:

class Author(models.Model):
    ...

class Post(models.Model):
    author = models.ForeignKey(Author)

Теперь я выбираю ModelAdmin, таким образом, что автор обнаруживается в режиме списка:

class PostAdmin(admin.ModelAdmin):
    list_display = [..., 'author',...]

Теперь в режиме списка, поле автора будет просто использовать __unicode__ метод Author класс для отображения автора. На вершине, которой я хотел бы ссылку, указывающую на URL соответствующего автора в администраторском сайте. Это возможно?

Ручной метод:

Ради полноты я добавляю ручной метод. Это должно было бы добавить метод author_link в PostAdmin класс:

def author_link(self, item):
    return '<a href="../some/path/%d">%s</a>' % (item.id, unicode(item))
author_link.allow_tags = True

Это будет работать на то конкретное поле, но это не то, что я хочу. Я хочу общий метод достигнуть того же эффекта. (Одна из проблем - то, как выяснить автоматически путь к объекту в django администраторском сайте.)

37
задан Olivier Verdier 18 March 2010 в 13:55
поделиться

2 ответа

Я не думаю, что есть механизм, позволяющий автоматически делать то, что вы хотите, из коробки.

Но что касается определения пути к странице редактирования администратора на основе идентификатора объекта, все, что вам нужно, это две части информации:

a) self.model._meta.app_label

b) self.model._meta.module_name

Затем, например, чтобы перейти на страницу редактирования этой модели, вы должны сделать:

'../%s_%s_change/%d' % (self.model._meta.app_label, self.model._meta.module_name, item.id)

Взгляните на django.contrib.admin.options .ModelAdmin.get_urls , чтобы узнать, как они это делают.

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

Но вы уверены, что не можете обойтись встроенными строками? Было бы лучше, если бы все связанные компоненты были на одной странице ...

Изменить:

Встроенные строки (связанные с документами) позволяют интерфейсу администратора отображать родительско-дочерние отношения в одном страницу вместо того, чтобы разбивать ее на две части.

В приведенном вами примере публикации / автора использование встроенных сообщений будет означать, что страница для редактирования сообщений также будет отображать встроенную форму для добавления / редактирования / удаления авторов. Намного более естественно для конечного пользователя.

В представлении списка администраторов вы можете создать вызываемый объект в модели Post, который будет отображать список авторов, разделенных запятыми. Таким образом, у вас будет представление списка сообщений с указанием правильных авторов, и вы сможете редактировать авторов, связанных с сообщением, непосредственно в интерфейсе администратора публикации.

9
ответ дан 27 November 2019 в 05:01
поделиться

Я искал решение той же проблемы и наткнулся на этот вопрос. ... в итоге решил его сам. Возможно, ОП больше не заинтересован, но это все еще может быть полезным для кого-то.

from functools import partial
from django.forms import MediaDefiningClass

class ModelAdminWithForeignKeyLinksMetaclass(MediaDefiningClass):

    def __getattr__(cls, name):

        def foreign_key_link(instance, field):
            target = getattr(instance, field)
            return u'<a href="../../%s/%s/%d">%s</a>' % (
                target._meta.app_label, target._meta.module_name, target.id, unicode(target))

        if name[:8] == 'link_to_':
            method = partial(foreign_key_link, field=name[8:])
            method.__name__ = name[8:]
            method.allow_tags = True
            setattr(cls, name, method)
            return getattr(cls, name)
        raise AttributeError

class Book(models.Model):
    title = models.CharField()
    author = models.ForeignKey(Author)

class BookAdmin(admin.ModelAdmin):
    __metaclass__ = ModelAdminWithForeignKeyLinksMetaclass

    list_display = ('title', 'link_to_author')

Замените 'partial' на Django's 'curry', если не используете python >= 2.5.

18
ответ дан 27 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: