2012-05-13 8 views
8

SINGLEというフォームを作成して、管理者が拡張プロファイルを持つ新しいユーザーを作成できるようにしたいと考えています。 adminと登録アプリを使用したくないことに注意してください。 私は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 

それはOKです: は、私は、この問題のために、次のDjangoのフォームをコード化されましたか?しかし、それは私にfirst_nameとlast_nameのエラーを与えます。 djangoはsave()メソッドでfirst_nameとlast_nameを期待していません。

+0

通常のフォームを使って 'save'メソッドにアクセスすることができません。これはモデルフォームで利用可能ですhttps://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method – super9

答えて

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() 
+0

あなたは正しいです。他のユーザープロフィールのフィールドはどうですか?ユーザーフィールドのように保存する必要がありますか?ところで、私はこれを行うための正しいソリューションを選択したことを確認したいと思います。それで、それは正しい? –

+6

'company'や 'address'のようなフィールドを意味する場合は、ユーザーと1対1の関係を持つUserProfileモデルを作成できます(https://docs.djangoproject.com/ja/dev/topics/auth /#auth-profiles)。この方法で、必要な数だけフィールドを追加し、user.get_profile()でフェッチすることができます。company –

関連する問題