0

2 種類のユーザー プロファイル (DoctorProfile と PatientProfile) を持つサイトを作成しています。それぞれが、User と OneToOneField 関係を持つ UserProfile を拡張します。

ModelForm を介して新しいユーザーを登録しようとすると、次のエラーが発生します。

duplicate key value violates unique constraint "accounts_userprofile_user_id_key"
DETAIL:  Key (user_id)=(38) already exists.

これは、PatientProfile が作成されたときに発生するようで、ユーザーを作成しようとします。ただし、ユーザーはすでに使用して作成されていますUser.objects.create_user()

ユーザーを一度だけ作成できるようにするにはどうすればよいですか?

これが私の(取り除かれた)forms.pyです:

class PatientProfileForm(ModelForm):
    supplied_email = forms.CharField(max_length=256, label="Email Address", required=True)
    supplied_password = forms.CharField(max_length=256, label="Password", required=True, widget=forms.PasswordInput())
    supplied_password_confirm = forms.CharField(max_length=256, label="Password (again)", required=True, widget=forms.PasswordInput())

    def save(self, profile_callback=None):
        master_patient_profile = MasterPatientProfile(user=User.objects.create_user(username=self.cleaned_data['supplied_email'], email=self.cleaned_data['supplied_email'], password=self.cleaned_data['supplied_password']))
        master_patient_profile.save()

models.py の短縮版:

class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True)
    address_line_1 = models.CharField(_('Address 1'), max_length=100)
    address_line_2 = models.CharField(_('Address 2'), max_length=100, blank=True)
    city = models.CharField(_('City'), max_length=50)
    state = models.CharField(_('State'), max_length=20)
    zipcode = models.CharField(_('ZIP Code'), max_length=5)

class PatientProfile(UserProfile):
    gender = models.ForeignKey(UserGender)
    phone_number = models.CharField(max_length=12)
    date_of_birth = models.DateField(null=True)

class DoctorProfile(UserProfile):
    specialty = models.ManyToManyField(DoctorSpecialty)
    professional_statement = models.TextField()

編集:(クリス・プラットの提案に基づく)

フォームのsave()メソッドは次のようになります。

new_user, created = User.objects.get_or_create(username=self.cleaned_data['supplied_email'], email=self.cleaned_data['supplied_email'])
    if created:
        new_user.set_password(self.cleaned_data['supplied_password'])

    master_patient_profile = MasterPatientProfile(user=new_user)
4

1 に答える 1

2

使用しないでくださいcreate_user。これは純粋に便利なメソッドであり、実際のUser作成フォームにのみ役立ちます。

それ以外の場所では、 を使用する必要がありますget_or_create。唯一の欠点は、それでパスワードを設定できないことです。そのため、2 つのステップで行う必要があります。

user, created = User.objects.get_or_create(username=self.cleaned_data['supplied_email'], email=self.cleaned_data['supplied_email'])
if created:
    user.set_password(self.cleaned_data['supplied_password'])
于 2012-06-12T15:03:07.213 に答える