Django用户configuration文件
当添加额外的字段到用户configuration文件,如位置,性别,雇主等,我应该添加额外的列django.contrib.auth.models.User
并保存在那里? 或者我应该创build一个新的表来保存用户configuration文件信息?
此外,当用户上传个人资料图片,我应该保存在同一个表? (注意,这不是一个生产服务器,我只是在我的本地runserver上做这件事情)。 谢谢
你必须为用户configuration文件build立一个模型:
class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) location = models.CharField(max_length=140) gender = models.CharField(max_length=140) employer = models.ForeignKey(Employer) profile_picture = models.ImageField(upload_to='thumbpath', blank=True) def __unicode__(self): return u'Profile of user: %s' % self.user.username
然后在settings.py
configuration:
AUTH_PROFILE_MODULE = 'accounts.UserProfile'
从概念上讲,OneToOneField类似于具有unique = True的ForeignKey,但是关系的“反向”侧将直接返回单个对象。 这是扩展用户类的推荐方式。
class UserProfile(models.Model): user = models.OneToOneField(User) ...
Django提供了一种在单独的表 (称为用户configuration文件)中存储有关用户的附加信息的方法。
目前的Django是1.9,这里是对过时的接受的答案的一些更新
- 使用
models.OneToOneField(User)
- add
related_name='profile'
- 对Python 3使用
.__str__()
和.format()
像这样
class UserProfile(models.Model): user = models.OneToOneField(User, related_name='profile') location = models.CharField(max_length=140) gender = models.CharField(max_length=140) ... def __str__(self): return 'Profile of user: {}'.format(self.user.username)
使用related_name
可以轻松访问用户的configuration文件,例如request.user
request.user.profile.location request.user.profile.gender
不需要额外的查找。
从Django 1.5开始,您可以使用一个简单的设置条目来将默认用户replace为您的自定义用户对象:
AUTH_USER_MODEL = 'myapp.MyUser'
有关更多详细信息,请查看此Django文档条目 。
有一个解决scheme,我在这里find。 基本上你只是扩展默认的formsUserCreationForm
但保持相同的名称。 它可以与Django的文档告诉你做UserProfiles
的方式无缝地工作。
答案可以更新添加信号接收器,如果它不存在,将创buildconfiguration文件,如果已经存在,则更新。
@receiver(post_save, sender=User) def create_or_update_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) instance.profile.save()