Django — полное имя пользователя в формате unicode

У меня много моделей, связанных с User, и я бы хотел, чтобы в моих шаблонах всегда отображалось его полное_имя, если оно доступно. Есть ли способ изменить значение по умолчанию User __unicode__() ? Или есть другой способ сделать это?

У меня есть зарегистрированная модель профиля, в которой я могу определить __unicode__(), должен ли я связать с ней все свои модели? Мне кажется, это не очень хорошая идея.


Представьте, что мне нужно отобразить форму для этого объекта

class UserBagde
    user = model.ForeignKey(User)
    badge = models.ForeignKey(Bagde)

Мне придется выделить поле с __unicodes__ каждого объекта, не так ли?
Как я могу иметь полные имена в имени пользователя?


person Pierre de LESPINAY    schedule 10.08.2012    source источник
comment
Также помните, что first_name и last_name являются необязательными полями в User. поэтому некоторые элементы вашего поля выбора могут не иметь текста, если вы выберете этот подход!   -  person Francis Yaconiello    schedule 10.08.2012
comment
Вот почему я сказал, что если доступно, это означает откат к умолчанию, если нет   -  person Pierre de LESPINAY    schedule 10.08.2012


Ответы (4)


Попробуй это:

User.full_name = property(lambda u: u"%s %s" % (u.first_name, u.last_name))

РЕДАКТИРОВАТЬ

Видимо, то, что вы хотите, уже существует.

https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_full_name

ТАКЖЕ

если необходимо заменить функцию unicode:

def user_new_unicode(self):
    return self.get_full_name()

# Replace the __unicode__ method in the User class with out new implementation
User.__unicode__ = user_new_unicode 

# or maybe even
User.__unicode__ = User.get_full_name()

Резервный вариант, если поля имени пусты

def user_new_unicode(self):
    return self.username if self.get_full_name() == "" else self.get_full_name()

# Replace the __unicode__ method in the User class with out new implementation
User.__unicode__ = user_new_unicode 
person Francis Yaconiello    schedule 10.08.2012
comment
Это больше, что я ищу. Можно ли куда-нибудь поместить это задание, чтобы оно было где угодно? - person Pierre de LESPINAY; 10.08.2012
comment
поместите его в models.py ЛЮБОГО установленного приложения, у меня обычно есть приложение для членства, в котором есть моя модель профиля, я бы поместил это в это объявление, но это больше личное предпочтение, чем что-либо еще. - person Francis Yaconiello; 10.08.2012
comment
Я согласен с расположением профиля, спасибо. На самом деле это работает, даже когда я не импортирую модель профиля, я не понимаю, как :) ... - person Pierre de LESPINAY; 10.08.2012
comment
вам не нужно импортировать какие-либо модели, достаточно просто иметь приложение в установленных приложениях. - person Francis Yaconiello; 10.08.2012
comment
как вызвать этот метод из представления? - person A.J.; 21.02.2014
comment
вы, вероятно, не стали бы вызывать функции замены юникода напрямую: full_name = str(request.user) получает строковое представление юникода текущего пользователя, вошедшего в систему, ИЛИ full_name = request.user.get_full_name() ИЛИ full_name = request.user.__unicode__() это действительно зависит от того, что вы делаете. - person Francis Yaconiello; 21.02.2014
comment
Вы можете иметь в виду: документы .djangoproject.com/en/2.0/topics/auth/customizing/ - person Antonio Romero Oca; 08.12.2017
comment
@AntonioRomero Этот вопрос/ответ был для более ранней версии Django. Ответ выше должен работать для всех версий Django 1.11.x LTS End of Life. - person Francis Yaconiello; 08.12.2017
comment
Ты прав. Но по данной (dev) ссылке фактически нет информации о функции get_full_name - person Antonio Romero Oca; 09.12.2017

Если у вас есть модель профиля, настроенная как Django предполагает, вы можете определить полное имя этой модели

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    ...

@property
def full_name(self):
    return "%s %s" % (self.user.first_name, self.user.last_name)

тогда везде, где у вас есть доступ к объекту user, вы можете легко сделать user.get_profile.full_name

В качестве альтернативы, если вам нужно только полное имя в шаблоне, вы можете написать простой тег:

@register.simple_tag
def fullname(user):
    return "%s %s" % (user.first_name, user.last_name)
person Timmy O'Mahony    schedule 10.08.2012
comment
Это то, что я уже делаю, когда я могу получить доступ к объекту пользователя напрямую (как я уже сказал, у меня уже есть модель профиля), но, например, в формах, когда мне нужно выбрать пользователя в списке, у меня всегда будут имена пользователей отображается - person Pierre de LESPINAY; 10.08.2012

Просто нажмите get_full_name на метод __unicode__ вот так

User.__unicode__ = User.get_full_name

Убедитесь, что вы переопределяете его вызываемым, а не результатом функции. User.get_full_name() не получится с открытыми и закрытыми скобками.

Поместите в любой включенный файл, и все должно быть хорошо.

person Jangita    schedule 16.03.2016

Я нашел быстрый способ сделать это в Django 1.5. Проверьте это: пользовательские модели пользователей

и я тоже замечаю,

User.__unicode__ = User.get_full_name()

которые упоминает Фрэнсис Яконьелло, не работает на моей стороне (Джанго 1.3). Будет вызывать ошибку следующим образом:

TypeError: unbound method get_full_name() must be called with User instance as first argument (got nothing instead)
person Too    schedule 19.11.2012