簡単な目的を達成するために、Djangoドキュメンテーション ここ をフォローしています。新しいユーザーが作成されたらすぐにユーザープロファイルを作成します。
「accounts」アプリがあり、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を使用して)新しいユーザーを追加しようとすると、新しく作成されたユーザーとユーザープロファイルではなく、次のエラーが発生します:/ admin/auth/user/add /の内部エラー現在のトランザクションは中止され、コマンドはトランザクションブロックの終わりまで無視されます
トレースバックエラーの部分は次のとおりです。
/djangoProjects/lwboanova/lwboanova/apps/accounts/models.py in create_user_profile
34: UserProfile.objects.create(user=instance)
整合性エラーのようですが、理由がわかりません。
Yaのいずれかが私にこれについていくつかの助けを与えることができれば素晴らしいでしょう。
ちょうどそれを理解しました。
追加するのを忘れた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)
...そしてすべてが意図したとおりに機能しています!
アシュレイを助けようとする乾杯^^
あなたは使用すべきではありません:
user = models.ForeignKey(User, unique=True)
代わりにこれを使用してください:
from Django.conf import settings
..
user = models.OneToOneField(settings.AUTH_USER_MODEL)
def create_profile(sender,**kwargs ):
if kwargs['created']:
user_profile=UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile,sender=User)
これが役立つと思います。
これは、Django Signals。Reference 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)
Signal.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
@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)
@receiver(post_save, sender=User) def save_profile(sender, instance, **kwargs): instance.profile.save()
このようにコードを読みやすくなります。