Отображение родительских полей в childs admin (list_display) - PullRequest
5 голосов
/ 02 февраля 2011

Вот фрагмент models.py

class Applicant(models.Model):
    name = models.CharField(...)
    email = models.CharField(...)

class Application(models.Model):
    applicant = models.ForeignKey(Applicant)
    text = models.TextField(...)

Вот мой admin.py:

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', *******]

admin.site.register(Application, ApplicationAdmin)

В ApplicationAdmin я хочу указать имя кандидата и адрес электронной почты.

Что вы пробовали, прежде чем спросить SO?
Я посмотрел на следующий код, который не работает:

list_display = ['text', 'applicant__name','applicant__email']

Я смотрел на ModelAdmin.inlines , но, как видно, отношения между родителями и детьми должны быть обращены вспять.

Есть предложения? Как я могу отобразить имя заявителя / адрес электронной почты в приложении Админ. Желательно без миграции базы данных с новыми полями и т. Д.

Ответы [ 2 ]

12 голосов
/ 02 февраля 2011

Вы можете сделать это как четвертую возможность в list_display документах . Просто добавьте метод в вашу модель приложения, например:

class Application(models.Model):
    applicant = models.ForeignKey(Applicant)
    text = models.TextField(...)

    def applicant_name(self):
        return self.applicant.name
    applicant_name.short_description = 'Applicant Name'

    def applicant_email(self):
        return self.applicant.email
    applicant_email.short_description = 'Applicant Email'

И тогда вы можете настроить ModelAdmin следующим образом:

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant_name', 'applicant_email']
0 голосов
/ 02 февраля 2011

Если вам нужно только отобразить его в списке:

class Applicant(models.Model):
    name = models.CharField(...)
    email = models.CharField(...)

    def __unicode__(self):
        return "%s <%s>" % (self.name, self.email)

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant']

Ответ на ваш комментарий

, но вы хотите, чтобы каждое поле было новой строкойстрока в админке, а не строка.

Не уверен, что это лучшее решение, но оно будет работать:

class Application(models.Model):

    @property
    def applicant__name(self):
        return self.applicant.name

    # or maybe:

    def __getattr__(self, name):
        if name.startswith('applicant__'):
            return gettattr(self.applicant, 
                            name[len('applicant__'):])
        raise AttributeError()

class ApplicationAdmin(model.ModelAdmin):
    list_display = ['text', 'applicant__name']
...