Django - User full name as unicode
Asked Answered
P

4

9

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 ?

Peeved answered 10/8, 2012 at 13:4 Comment(2)
Also remember first_name and last_name are optional fields in User. so some elements of your select box could have no text if you go with this approach!Juggins
That's why I said "if available" meaning fallback to default if notPeeved
J
23

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 
Juggins answered 10/8, 2012 at 13:14 Comment(9)
That's more what I'm searching. Is there somewhere I can put this assignment in order to have it anywhere ?Peeved
put it in the models.py of ANY installed app, I generally have a membership app, that has my profile model, I would put this under that declaration, but that s more personal preference than anything.Juggins
I agree with the profile location, I'll that thanks. Actually it seems to work even when I don't import the profile model, I don't understand how :) ...Peeved
you don't have to import any models, just by having the app in your installed apps is enough.Juggins
how to call this method from view?Lebar
you wouldn't probably call the unicode replacement functions directly: full_name = str(request.user) gets the unicode string representation of the currently logged in user OR full_name = request.user.get_full_name() OR full_name = request.user.__unicode__() it really kinda depends on what you are doing.Juggins
You may mean: docs.djangoproject.com/en/2.0/topics/auth/customizing/…Thayer
@AntonioRomero This question/answer was for a much earlier version of Django. The answer above should work for all versions through Django 1.11.x LTS End of LifeJuggins
You are right. But at the given (dev) link there is actually no information about the function get_full_nameThayer
P
3

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)
Police answered 10/8, 2012 at 13:10 Comment(1)
That's what I'm already doing when I can access to the user object directly (as I said I already have a profile model) but for example in forms when I have to choose from a user in a list, I'll always have usernames displaiedPeeved
R
1

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.

Ramburt answered 16/3, 2016 at 16:59 Comment(0)
C
0

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)
Consueloconsuetude answered 19/11, 2012 at 4:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.