#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__()
соответствующего объекта.
Я не вижу никакого способа обойти это.