/ / Djangoでユーザフォームを追加する - django、profile

DjangoでのAdd userフォームの作成 - django、profile

私は シングル 管理者に能力を与えるフォーム拡張プロファイルを持つ新しいユーザーを作成します。私は管理者用アプリと登録用アプリを使いたくありません。 私はUserProfileモデルでユーザーを拡張しました。私は、ユーザープロファイルの拡張に関するすべての文書を読んだ。しかし、私は本当にこれらの情報を保存する方法を知りません。 私はこの問題のために以下のdjango形式をコード化しました:

class CreateUserForm(forms.Form):
username = forms.CharField(max_length=30)
first_name = forms.CharField()
last_name = forms.CharField()
password1=forms.CharField(max_length=30,widget=forms.PasswordInput()) #render_value=False
password2=forms.CharField(max_length=30,widget=forms.PasswordInput())
email=forms.EmailField(required=False)

title = forms.ChoiceField(choices=TITLE_CHOICES)

def clean_username(self): # check if username dos not exist before
try:
User.objects.get(username=self.cleaned_data["username"]) #get user from user model
except User.DoesNotExist :
return self.cleaned_data["username"]

raise forms.ValidationError("this user exist already")


def clean(self): # check if password 1 and password2 match each other
if "password1" in self.cleaned_data and "password2" in self.cleaned_data:#check if both pass first validation
if self.cleaned_data["password1"] != self.cleaned_data["password2"]: # check if they match each other
raise forms.ValidationError("passwords dont match each other")

return self.cleaned_data


def save(self): # create new user
new_user=User.objects.create_user(username=self.cleaned_data["username"],
first_name=self.cleaned_data["first_name"],
last_name=self.cleaned_data["last_name"],
password=self.cleaned_data["password1"],
email=self.cleaned_data["email"],
)

return new_user

大丈夫ですか?しかし、それは私にfirst_nameとlast_nameのエラーを与えます。 djangoはsave()メソッドのfirst_nameとlast_nameを期待していません。

回答:

回答№1の13

create_userはユーザー名、電子メール、およびパスワード引数のみをサポートします。最初にcreate_userを呼び出し、追加の値を保存されたオブジェクトに追加します。

new_user=User.objects.create_user(self.cleaned_data["username"],
self.cleaned_data["email"],
self.cleaned_data["password1"])
new_user.first_name = self.cleaned_data["first_name"]
new_user.last_name = self.cleaned_data["last_name"]
new_user.save()