亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建擴展的用戶配置文件

創建擴展的用戶配置文件

叮當貓咪 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 關注
  • 778 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號