为了账号安全,请及时绑定邮箱和手机立即绑定

创建扩展的用户配置文件

创建扩展的用户配置文件

叮当猫咪 2019-12-12 13:54:58
我在Django中有一个扩展的UserProfile模型:class UserProfile(models.Model):  user = models.ForeignKey(User, unique=True)  #other things in that profile还有一个signal.py:from registration.signals import user_registeredfrom models import UserProfilefrom django.contrib.auth.models import Userdef createUserProfile(sender, instance, **kwargs):  profile = users.models.UserProfile()  profile.setUser(sender)  profile.save()user_registered.connect(createUserProfile, sender=User)我通过在我的__init__.py:中确保信号被注册:import signals因此,应该为每个注册用户创建一个新的UserProfile,对吗?但事实并非如此。尝试登录时,总是出现“ UserProfile匹配查询不存在”错误,这意味着该数据库条目不存在。我应该说我使用django-registration,它提供了user_registered信号。为此,重要应用程序的结构是,我有一个名为“用户”的应用程序,这里有:models.py,signals.py,urls.py和views.py(以及其他一些在这里无关紧要的东西) )。UserProfile类在models.py中定义。更新:我将signals.py更改为:from django.db.models.signals import post_savefrom models import UserProfilefrom django.contrib.auth.models import Userdef create_profile(sender, **kw):    user = kw["instance"]    if kw["created"]:        profile = UserProfile()        profile.user = user        profile.save()post_save.connect(create_profile, sender=User)但是现在我收到一个“ IntegrityError”:“列user_id不是唯一的”编辑2:我找到了。好像我以某种方式注册了两次信号。此处介绍了解决方法:http : //code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave我必须添加一个dispatch_uid,现在我的signals.py看起来像这样并且正在工作:from django.db.models.signals import post_savefrom django.contrib.auth.models import Userfrom models import UserProfilefrom django.db import modelsdef create_profile(sender, **kw):    user = kw["instance"]    if kw["created"]:        profile = UserProfile(user=user)        profile.save()post_save.connect(create_profile, sender=User, dispatch_uid="users-profilecreation-signal")
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

您可以在用户上使用post_save实现它:


from django.db.models.signals import post_save

from models import UserProfile

from django.contrib.auth.models import User


def create_profile(sender, **kwargs):

    user = kwargs["instance"]

    if kwargs["created"]:

        profile = users.models.UserProfile()

        profile.setUser(sender)

        profile.save()


post_save.connect(create_profile, sender=User)

编辑:

另一个可能的解决方案,它已经过测试并且可以正常工作(我正在我的网站上使用它):


from django.db import models

from django.contrib.auth.models import User

from django.db.models.signals import post_save

def create_profile(sender, **kwargs):

    user = kwargs["instance"]

    if kwargs["created"]:

        up = UserProfile(user=user, stuff=1, thing=2)

        up.save()

post_save.connect(create_profile, sender=User)


查看完整回答
反对 回复 2019-12-12
?
暮色呼如

TA贡献1853条经验 获得超9个赞

这对我有帮助:primary_key = True


class UserProfile(models.Model):

    user = models.OneToOneField(User, unique=True, primary_key=True, related_name="user")

    phone = models.CharField(('phone'),max_length=30, blank=False, null=True)

    user_building = models.ManyToManyField(Building, blank=True)

    added_by = models.ForeignKey(User, blank=True, null=True, related_name="added")


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 736 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信