问题
I have many Models linked to User
and I'd like my templates to always display his full_name if available. Is there a way to change the default User
__unicode__()
? Or is there another way to do it ?
I have a profile model registered where I can define the __unicode__()
, should I link all my models to it ? Seems not a good idea to me.
Imagine I need to display the form for this object
class UserBagde
user = model.ForeignKey(User)
badge = models.ForeignKey(Bagde)
I will have to select box with __unicodes__
of each object, won't I ?
How can I have full names in the user's one ?
回答1:
Try this:
User.full_name = property(lambda u: u"%s %s" % (u.first_name, u.last_name))
EDIT
Apparently what you want already exists..
https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_full_name
ALSO
if its imperative that the unicode function be replaced:
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()
Fallback if name fields are empty
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
回答2:
If you have a profile model set up as Django suggests, you could define the full name on that model
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)
then anywhere you have access to the user
object you can easily do user.get_profile.full_name
Alternatively, if you only need the full name in the template you could write a simple tag:
@register.simple_tag
def fullname(user):
return "%s %s" % (user.first_name, user.last_name)
回答3:
Just slam get_full_name
to the __unicode__
method like so
User.__unicode__ = User.get_full_name
Make sure you override it with the callable, not the result of the function. User.get_full_name()
will fail with the open and close brackets.
Place on any included file and you should be good.
回答4:
I found there's a quick way to do this in Django 1.5. Check this: custom User models
and I also notice,
User.__unicode__ = User.get_full_name()
which metions by Francis Yaconiello is not work on my side (Django 1.3). Will raise error like this:
TypeError: unbound method get_full_name() must be called with User instance as first argument (got nothing instead)
来源:https://stackoverflow.com/questions/11902262/django-user-full-name-as-unicode