Изменение отображения пользователя в Django

#django #django-models #django-admin

#django #django-модели #django-администратор

Вопрос:

Я хотел бы видеть user.email вместо user.username при вызове print (user). Это означает, что в моем администраторе я хотел бы видеть электронные письма как внешние ключи.

Обычно я бы поступил следующим образом, как описано в руководстве по django:

 class Poll(models.Model):
# ...
def __unicode__(self):
    return self.question
  

Однако пользовательский класс предварительно написан, и я не хочу модифицировать Django. Как тогда мне следует поступить?

ОБНОВЛЕНИЕ: Я добавил следующее в свою модель:

 def email(self):
    u = User.object.get(pk=self.user.id)
    return u.email
  

Как мне теперь привязать его к моему list_display?

Ответ №1:

Вы могли бы определить метод в вашем классе опроса под названием ‘get_username’ или что-то в этом роде, который возвращает адрес электронной почты пользователя вместо его фактического имени пользователя. Затем передайте ‘get_username’ в качестве параметра вашему атрибуту ‘list_display’ в ModelAdmin вашего класса Poll.

Комментарии:

1. спасибо, я добавил код, можете ли вы помочь мне привязать его к list_display?

2. Зачем вам нужна помощь с этим? Просто добавьте имя.

3. Я попытался добавить подобное в admin.py list_display('id', 'email') но это не сработало бы. Мне пришлось переместить все определение класса PollAdmin в models.py и теперь это работает. Я не знаю, является ли это плохой практикой, но это был единственный способ заставить это работать

4. Вы можете изменить свою функцию только на следующую строку ‘return self.user.email’. Затем вы просто добавляете имя функции в list_display. Когда вы говорите, что раньше это не работало, что вы имеете в виду? Это вообще не отображалось? Если он вообще не отображался, возможно, это признак того, что ваш администратор не был зарегистрирован?

Ответ №2:

Определенный вами вариант использования требует переопределения User.__unicode__ метода.

Из документов django на list_display:

Если поле является ForeignKey, Django отобразит __unicode__() соответствующего объекта.

Я не вижу никакого способа обойти это.