私の Web アプリでは、通常のサイト ユーザーと従業員の 2 人のユーザーが必要です。AbstractUser
これを達成するために、に基づくカスタムユーザーを使用しています。
class CustomUser(AbstractUser):
pass
class Employee(CustomUser):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# other fields
settings.py には次のものがあります。
AUTH_USER_MODEL = 'app.CustomUser'
通常のサイト ユーザーと従業員ユーザーの両方にプロファイル ページを提供したいと考えています。
まず、UserProfileEditForm
通常のサイト ユーザー向けのフォームを作成しました。
class UserProfileEditForm(forms.ModelForm):
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False)
last_name = forms.CharField(required=False)
class Meta:
model = get_user_model()
fields = ('email', 'first_name', 'last_name')
def clean_email(self):
username = self.cleaned_data.get('username')
email = self.cleaned_data.get('email')
if email and get_user_model().objects.filter(email=email).exclude(username=username).count():
raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
return email
def save(self, commit=True):
user = super(UserProfileEditForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
対応するビュー:
@login_required
def user_profile_edit(request):
user = get_user_model()
if request.method == 'POST':
form = UserProfileEditForm(request.POST, instance=request.user)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
return redirect('user_profile')
else:
form = UserProfileEditForm(instance=request.user)
return render(request, 'user/user_profile_edit.html', {
'form': form
})
そしてフォーム:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Update Information</button>
</form>
ユーザー プロファイルの編集ページで、電子メールが電子メール フィールドに正しく入力されていることがわかります。[送信] をクリックすると、検証エラー メッセージが表示されます。
この電子メールアドレスが既に使用されている。別の電子メール アドレスを入力してください。
あたかも更新フォームが新しいユーザーを作成しようとしているかのようです。これを修正するにはどうすればよいですか?
おまけの質問: 従業員ユーザーのユーザー プロファイル ページでも同じ解決策が機能しますか?