ユーザーモデルを拡張するために、ユーザーとOneToOneの関係を持つクライアントモデルがあります。ユーザーを(ユーザーフィールドとクライアントフィールドの両方を含むフォームで)登録できる必要があり、そのためにdjango-registrationを使用しました。私が見つけたいくつかのスニペットに基づいた登録のビューは次のとおりです。
def register_client(request):
if request.method == 'POST':
userform = UserForm(request.POST, prefix='user')
clientform = ClientForm(request.POST, prefix='client')
if userform.is_valid() and clientform.is_valid():
user = userform.save()
client = clientform.save(commit=False)
client.user = user
client.save()
login(request, user)
return HttpResponseRedirect('/webapp/')
else:
return HttpResponse('error!')
else:
userform = UserForm(prefix='user')
clientform = ClientForm(prefix='client')
t = loader.get_template('register.html')
c = RequestContext(request, {
'userform':userform,
'clientform':clientform,
})
return HttpResponse(t.render(c))
そして、これが私のフォームです:
from registration.forms import RegistrationForm
class UserForm(RegistrationForm):
def save(self):
new_user = User.objects.create_user(
username=self.cleaned_data['username'],
email = self.cleaned_data['email'],
password=self.cleaned_data['password1'])
new_user.backend='django.contrib.auth.backends.ModelBackend'
new_user.save()
return new_user
class ClientForm(forms.ModelForm):
class Meta:
model = Client
exclude = ['user']
RegistrationFormは一般的なフォームのようなメソッドを実装していないため、UserFormにsave()メソッドを実装しました。
フォームを保存するために、バックエンドを実装するためにすべての問題を解決する必要があるのはなぜですか?この簡単な方法に問題はありますか?それは機能します。
new_user.backend='django.contrib.auth.backends.ModelBackend'
(登録後にユーザーに自動的にログインできるように追加しました。)