0

私の 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>

ユーザー プロファイルの編集ページで、電子メールが電子メール フィールドに正しく入力されていることがわかります。[送信] をクリックすると、検証エラー メッセージが表示されます。

この電子メールアドレスが既に使用されている。別の電子メール アドレスを入力してください。

あたかも更新フォームが新しいユーザーを作成しようとしているかのようです。これを修正するにはどうすればよいですか?

おまけの質問: 従業員ユーザーのユーザー プロファイル ページでも同じ解決策が機能しますか?

4

1 に答える 1