我正在关注Django文档here以实现一个简单的目标:创建新用户后立即创建用户配置文件。
我有一个'帐户'应用,我的accounts.models看起来像这样:
# -*- coding: utf-8 -*-
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from main.models import Store
class UserProfile(models.Model):
GENRE_CHOICES = (
('m', 'Masculino'),
('f', 'Feminino'),
)
MARITAL_STATUS_CHOICES = (
('s', 'Solteiro'),
('c', 'Casado'),
('d', 'Divorciado'),
('v', 'Viúvo'),
)
user = models.ForeignKey(User, unique=True)
birth_date = models.DateField()
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
address = models.CharField(max_length=150)
postal_code_4 = models.PositiveIntegerField()
postal_code_3 = models.PositiveIntegerField()
locatity = models.CharField(max_length=30)
marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES)
child_amount = models.PositiveSmallIntegerField()
is_merchant = models.BooleanField(default=False)
store = models.ForeignKey(Store, null=True)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
一切看起来都不错,但在尝试添加新用户时(使用django admin),而不是新创建的用户和用户配置文件,我收到以下错误: / strong / auth / user / add /中的 InternalError 当前事务中止,命令被忽略,直到事务块结束
以下是回溯错误部分:
/djangoProjects/lwboanova/lwboanova/apps/accounts/models.py in create_user_profile
34: UserProfile.objects.create(user=instance)
这似乎是一个完整性错误,但我没有理由。
如果任何一个人能给我一些帮助,那就太棒了。
答案 0 :(得分:15)
刚想通了。
我忘了将null=True
添加到剩余的UserProfile
模型字段中。
所以accounts.models.UserProfile
字段现在看起来像:
user = models.ForeignKey(User, unique=True)
birth_date = models.DateField(null=True)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES, null=True)
address = models.CharField(max_length=150, null=True)
postal_code_4 = models.PositiveIntegerField(null=True)
postal_code_3 = models.PositiveIntegerField(null=True)
locatity = models.CharField(max_length=30, null=True)
marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES, null=True)
child_amount = models.PositiveSmallIntegerField(null=True)
is_merchant = models.BooleanField(default=False)
store = models.ForeignKey(Store, null=True)
......一切都按预期工作!
干杯试图帮助Ashray ^^
答案 1 :(得分:14)
你不应该使用:
user = models.ForeignKey(User, unique=True)
而是使用它:
from django.conf import settings
..
user = models.OneToOneField(settings.AUTH_USER_MODEL)
答案 2 :(得分:1)
def create_profile(sender,**kwargs ):
if kwargs['created']:
user_profile=UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile,sender=User)
我认为这会对你有帮助。
答案 3 :(得分:0)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if kwargs.get('created', True) and not kwargs.get('raw', False):
Profile.objects.create(user=instance)
答案 4 :(得分:0)
@receiver(post_save,sender = User) def save_profile(发件人,实例,** kwargs): instance.profile.save()
答案 5 :(得分:0)
您可以使用Django Signals创建它。参考https://docs.djangoproject.com/en/2.2/topics/signals/
将其添加到settings.py中的installed_apps
# settings.py
INSTALLED_APPS = [
...
'accounts.apps.AccountsConfig',
...
]
注意:如果您在INSTALLED_APPS中使用accounts
,则必须在 init .py
在models.py中,删除create_user_profile
# models.py
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from main.models import Store
class UserProfile(models.Model):
GENRE_CHOICES = (
('m', 'Masculino'),
('f', 'Feminino'),
)
MARITAL_STATUS_CHOICES = (
('s', 'Solteiro'),
('c', 'Casado'),
('d', 'Divorciado'),
('v', 'Viúvo'),
)
user = models.OneToOneField(User)
birth_date = models.DateField()
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
address = models.CharField(max_length=150)
postal_code_4 = models.PositiveIntegerField()
postal_code_3 = models.PositiveIntegerField()
locatity = models.CharField(max_length=30)
marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES)
child_amount = models.PositiveSmallIntegerField()
is_merchant = models.BooleanField(default=False)
store = models.ForeignKey(Store, null=True)
在Signals.py中添加create_user_profile
# signals.py
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import UserProfile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
最后,编辑apps.py
# apps.py
from django.apps import AppConfig
class AccountsConfig(AppConfig):
name = 'accounts'
def ready(self):
import accounts.signals
答案 6 :(得分:0)
我成功尝试了这种方法
def create_profile(sender,**kwargs ):
if kwargs['created']:
user_profile=UserProfile(user=kwargs['instance'])
user_profile.save()
post_save.connect(create_profile, sender=User)