4

I just started a Django project (there are no apps in it). I activated the admin in settings file and can access the Django administration page. There is a column in Django page to add users; while adding users I get only three fields under personnal info, but I need to store some more information about users. I Googled around and found that I can use user profiles to accomplish this. I tried, but I am having problems.

My aim is to add three more fields to the user table:

  1. role
  2. contact number
  3. other

I need details like: which function I need to write and where to do this.

I found this, but I do not know where I need to write these steps. I would greatly appreciate a more clear explanation of this.

Jason Sundram
  • 12,225
  • 19
  • 71
  • 86
xrage
  • 4,690
  • 4
  • 25
  • 31

2 Answers2

4

Django User Profiles is what you need. The blog you linked to has clear steps on how to do it. You can check out the Django documentation. http://www.turnkeylinux.org/blog/django-profile also provides a good explanation. Basically you need to create a new model with User as ForeignKey and define the model in the settings.py as AUTH_PROFILE_MODULE = "django_app.your_profile_modelname". Create the profile and save it just like any other model, and access it using user.get_profile()

Adding a couple of things in response to your questions below: First, do not create apps as a directory. Use startapp <appname> [destination] as described here. That will create the app directory. Second, you have to add the app to INSTALLED_APPS in the project's settings file, do a syncdb. Basically, follow the steps in Django tutorial on writing your first app. Third, UserProfile is a separate model. It is not an extension of User. It is associated with the User just because you added User as the ForeignKey. Fourth, to be able to see the user profile model in admin, you do exactly what you would do to add any other model to admin page. Create a file names admin.py under your app with:

from django.contrib import admin
from myproject.app.models import UserProfile
admin.site.register(UserProfile)
zaphod
  • 2,045
  • 1
  • 14
  • 18
  • as described by you and turkeylinux site, i created one file named models.py under a directory named apps, then added AUTH_PROFILE_MODULE = 'mysite.apps.UserProfile' here my site the project name, apps is a directory inside mysite dir, inside this app directory i had created the file models.py having following content – xrage Jul 13 '12 at 15:25
  • from django.db import models from django.contrib.auth.models import User class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) url = models.URLField("Website", blank=True) company = models.CharField(max_length=50, blank=True) User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) then uses command to sync db, after that again i checked in my admin page there were no extra fields available. still i am getting same three fields first name, last name and email. my aim is to add some more fields in db and populate using admin page. – xrage Jul 13 '12 at 15:31
  • What fields do you see in `UserProfile` model on admin page? You have added fields to `UserProfile`, not to `User`. Hence they will be visible under `UserProfile` model. – zaphod Aug 06 '12 at 19:32
1

There are three key concepts to understand:

  1. There is no built in "profile" system in Django, beyond the limited auth app which is really geared just to user login. You are expected to roll your own.
  2. There is nothing magical about a profile record in itslef, it is just like any other record that takes User as a foreign key (or, more properly, a one-to-one field as per the docs). You create it by creating a custom django app (traditionally called profiles) and a model for that app (traditionally called UserProfile, since Profile is not allowed as a model name).
  3. The only thing that sets UserProfile aparts as a model is that you specify it as the AUTH_PROFILE_MODULE which means that it is accessible when called .get_profile() on a User record. That's it. If you set up the UserProfile like so:

    def UserProfile(models.Model):
        user = models.OneToOneField(User, related_name='profile')
        other fields
    

    then you can also access the profile as user.profile rather than user.get_profile() which some people prefer.

Again, nothing magical about the profile model -- it is just a model record like any other model record.

If you want to be able to edit additional fields within the user form that's more complicated; easiest way is probable unregister User and then register it again using your custom ModelAdmin and form class but judging by your question you're probably not at that level yet.

Jordan Reiter
  • 20,467
  • 11
  • 95
  • 161