私の質問が非常に明白であり、UserProfile
を使用しているほとんどすべての開発者がそれに答えることができるはずだと思うなら。
しかし、DjangoドキュメントまたはDjango本でヘルプを見つけることができませんでした。
UserProfile
フォームをDjangoフォームで実行する場合は、プロファイルフィールドといくつかのUser
フィールドを変更する必要があります。
しかし、forms.UserProfileForm
はありません(まだ?)!
どうやってそれをしますか?
これが私がついにやった方法です:
class UserProfileForm(forms.ModelForm):
first_name = forms.CharField(label=_(u'Prénom'), max_length=30)
last_name = forms.CharField(label=_(u'Nom'), max_length=30)
def __init__(self, *args, **kw):
super(UserProfileForm, self).__init__(*args, **kw)
self.fields['first_name'].initial = self.instance.user.first_name
self.fields['last_name'].initial = self.instance.user.last_name
self.fields.keyOrder = [
'first_name',
'last_name',
...some_other...
]
def save(self, *args, **kw):
super(UserProfileForm, self).save(*args, **kw)
self.instance.user.first_name = self.cleaned_data.get('first_name')
self.instance.user.last_name = self.cleaned_data.get('last_name')
self.instance.user.save()
class Meta:
model = UserProfile
私は今日これに出くわしました、そして、いくつかのグーグルの後、私は私の意見で少しきれいな解決策を見つけました:
#in forms.py
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email"]
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
#in views.py
def add_user(request):
...
if request.method == "POST":
uform = UserForm(data = request.POST)
pform = UserProfileForm(data = request.POST)
if uform.is_valid() and pform.is_valid():
user = uform.save()
profile = pform.save(commit = False)
profile.user = user
profile.save()
....
...
#in template
<form method="post">
{{ uform.as_p }}
{{ pform.as_p }}
<input type="submit" ...>
</form>
これは私が現在のトランクでそれをした方法です(改訂:11804)。ナティムの解決策は私にはうまくいきませんでした。
admin.py
:
class ProfileAdmin(admin.ModelAdmin):
form = ProfileForm
def save_model(self, request, obj, form, change):
obj.user.first_name = form.cleaned_data['first_name']
obj.user.last_name = form.cleaned_data['last_name']
obj.user.save()
obj.save()
forms.py
:
class ProfileForm(forms.ModelForm):
first_name = forms.CharField(max_length=256)
last_name = forms.CharField(max_length=256)
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
try:
self.fields['first_name'].initial = self.instance.user.first_name
self.fields['last_name'].initial = self.instance.user.last_name
except User.DoesNotExist:
pass
class Meta:
fields = ['first_name', 'last_name', ...etc.]
プロファイルアプリがあるDjango-basic-appsプロジェクトを使用することもできます。
これは私がずっと前に私のプロジェクトで使用したものであり、うまくいけば、他の人がこの問題をグーグルで検索するのに役立つはずです。
class SignUpForm(forms.ModelForm):
first_name = forms.CharField(max_length = 30)
last_name = forms.CharField(max_length = 30)
username = forms.CharField(max_length = 30)
password = forms.CharField(widget = forms.PasswordInput)
password1 = forms.CharField(widget = forms.PasswordInput)
class Meta:
model = UserProfile
exclude = ['user']
def clean_username(self): # check if username does 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 choose an0ther username")
def clean(self, *args , **kwargs):
super(SignUpForm).clean(*args ,**kwargs) # 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 don't match each other")
return self.cleaned_data
def save(self): # create new user
new_user = User.objects.create_user(username=self.cleaned_data['username'],password=self.cleaned_data['password1'],email=self.cleaned_data['email'])
new_user.first_name = self.cleaned_data['first_name']
new_user.last_name = self.cleaned_data['last_name']
new_user.save()
UserProf = super(SignUpForm,self).save(commit = False)
UserProf.user = new_user
UserProf.save()
return UserProf
バックエンドに2つのモデルフォームを用意し、それらを1つのフォームとしてテンプレートに表示してみませんか? UserProfileFormから名前フィールドを削除し、ユーザーオブジェクトの2番目のモデルフォームを作成しますか?
2つのモデルを1つのフォームにマージするときに、ドキュメントに情報が見つからないのは普通のことです。
あるいは、おそらく非常に明白に、次のことができます。1つはユーザー用、もう1つはユーザープロファイル用の2つのモデルフォームを作成します。名と姓のみを表示するようにuserprofilemodelformを設定します。両方のフォームを1つの<form>
タグ内の同じテンプレートに配置します。送信したら、各フォームの保存メソッドを呼び出します。