auth.User モデルに情報を追加するために、このドキュメントに従いました。ユーザーを社会 (たとえば、ユーザーがクライアントであると仮定) およびこの社会の仕事にリンクしたいと思います。だからここに私のコードがあります:
社会/models.py:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class UserProfile(models.Model):
"""
Stores the user informations except
login basic informations.
"""
user = models.OneToOneField(User)
firstname = models.CharField(max_length=128)
lastname = models.CharField(max_length=128)
society = models.ForeignKey('Society')
job = models.ForeignKey('UserJob')
class Society(models.Model):
"""
Stores the informations about the societies.
"""
name = models.CharField(max_length=128)
class UserJob(models.Model):
"""
Stores the user job category in the society.
"""
name = models.CharField(max_length=64)
def create_user_profile(sender, instance, created, **kwargs):
"""
Uses the post_save signal to link the User saving to
the UserProfile saving.
"""
if created:
UserProfile.objects.create(user=instance)
#the instruction needed to use the post_save signal
post_save.connect(create_user_profile, sender=User)
社会/admin.py:
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from societies.models import UserProfile, Society, UserJob
class UserProfileInline(admin.StackedInline):
"""
Defines an inline admin descriptor for UserProfile model
which acts a bit like a singleton
"""
model = UserProfile
can_delete = False
verbose_name_plural = 'profile'
class UserAdmin(UserAdmin):
"""
Defines a new User admin.
"""
inlines = (UserProfileInline, )
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
admin.site.register(Society)
admin.site.register(UserJob)
管理サイトのユーザー フォームにフィールドを配置するために、UserProfileInline を追加しました。次の行を settings.py に追加しました。
AUTH_PROFILE_MODULE = 'societies.UserProfile'
問題は、UserProfile 固有のフィールドへの入力を含め、管理サイトのユーザー フォームからユーザーを作成しようとすると、次のようになることです。
/admin/auth/user/add/ の IntegrityError
(1048、「列 'society_id' を null にすることはできません」)
フォームで社会を指定したので、問題が create_user_profile 関数を使用したシグナル処理に起因するものではないかどうかを自問しています。前述のドキュメントを考えると、これ以上何もする必要はありません。ただし、 UserProfile.create(...) 呼び出しを使用して、UserProfile フィールドの firstname、lastname、social、および job を入力する方法を正確にする必要はありませんか? (「user=instance」パラメーターに加えて)。この場合、パラメーターを満たす正しい要素を取得する方法がわかりません。ドキュメントでは、「accepted_eula」と「favorite_animal」に関して何も行われていないので、私は確かに間違っています...そうではありませんか?
返信ありがとうございます。私の言葉で申し訳ありません。