私の意図は、Django の User モデルと UserProfile モデル (基本的にユーザーに関する詳細/フィールドを追加する) を使用してユーザー プロファイルを作成することです。次に、User Model と UserProfile Model の両方に含まれるフィールドに入力するよう求める登録フォーム (つまり、両方のモデルのフィールド用の単一フォーム) を作成したいと考えています。
現在起こっていることは、必要なデータをフォームに入力した後、ビューが通過し、サーバーが User オブジェクトを作成し、それを UserProfile オブジェクトにリンクすることです (私が理解している限り、このリンクは、で作成されたシグナルのために発生します) models.py クラス)。ただし、UserProfile (この場合は「場所」フィールド) に関する情報は追加されず、私の人生では理由がわかりません。
私は次のmodels.pyを持っています
class UserProfile(models.Model):
# This field is required.
user = models.ForeignKey(User, unique=True, related_name="connector")
location = models.CharField(max_length=20, blank=True, 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)
私は次のforms.pyを持っています(UserFormはDjangoによって定義されたユーザーモデルに基づいています)
class UserForm(ModelForm):
class Meta:
model = User
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
私は次のviews.pyを持っています
@csrf_protect
def register(request):
if request.method == 'POST':
form1 = UserForm(request.POST)
form2 = UserProfileForm(request.POST)
if form1.is_valid() and form2.is_valid():
#create initial entry for user
username = form1.cleaned_data["username"]
password = form1.cleaned_data["password"]
new_user = User.objects.create_user(username, password)
new_user.save()
#create entry for UserProfile (extension of new_user object)
profile = form2.save(commit = False)
profile.user = new_user
profile.save()
return HttpResponseRedirect("/books/")
else:
form1 = UserForm()
form2 = UserProfileForm()
c = {
'form1':form1,
'form2':form2,
}
c.update(csrf(request))
return render_to_response("registration/register.html", c)
私は次のregister.htmlを持っています
<form action="/accounts/register/" method="post">{% csrf_token %}
<p style="color:red"> {{form.username.errors}}</p>
{{ form1.as_p }}
{{ form2.as_p }}
<input type="submit" value="Create the account">
</form>
誰かが私が間違っていることを見ることができますか? これを行うより良い方法はありますか?前もって感謝します!