Pretty options for Django's auth.User

Published on 2010-04-22 09:07:00+00:00
Python   django   web  

Several of my Django Apps have Foreign Key relationships to django.contrib.auth.model.User. In Django's admin app, these show up a select elements displaying the username attribute. For some people, that may be OK, but for most of the people with which I work, it's not. We want to see prettier options, i.e. each User's full name as the options in that select element.

So, here's how it works. We override the ModelChoiceField (for ForeignKeys) and the ModelMultipleChoiceField (for ManyToMany Fields):

from django.forms import ModelChoiceField, ModelMultipleChoiceField  
class UserModelChoiceField(ModelChoiceField):  
 A ModelChoiceField to represent User   
 select boxes in the Auto Admin   
    def label\_from\_instance(self, obj):  
        return "%s (%s)"%(obj.get_full_name(), obj.username)  
class UserModelMultipleChoiceField(ModelMultipleChoiceField):  
 Similar to UserModelChoiceField, provide a nicer-looking   
 list of user names for ManyToMany Relations...  
    def label\_from\_instance(self, obj):  
        return "%s (%s)"%(obj.get_full_name(), obj.username)  

Then, to customize the admin, you need to create a custome ModelForm for your Model. So, if I had a Model that looked like this:

class MyModel(models.Model):  
    user = models.ForeignKey(User)  

You'd need to create the following ModelForm:

class MyModelAdminForm(forms.ModelForm):  
    user = UserModelChoiceField(User.objects.all().order_by('first\_name', 'last\_name', 'username'))  
    class Meta:  
        model = MyModel  

Now, when you create a ModelAdmin class for the MyModel, you specify the above form:

from models import MyModel  
from forms import MyModelAdminForm  
class MyModelAdmin(admin.ModelAdmin):  
    form = MyModelAdminForm, MyModelAdmin)  

At this point, the choices for User objects in the admin should contain the user's full name and their username in parenthesis.