0

ユーザーが姓名、ユーザー名、メールアドレス、電話番号を入力できるアカウント設定ページがあります。またPasswordChangeForm、Django が提供する を利用して、ユーザーが同じ単一のフォームでパスワードを変更できるようにしています。

ユーザーが「古いパスワード」「新しいパスワード」「新しいパスワード」を入力しなくても、メールアドレスや電話番号などの個人情報を変更できるようにしたいと考えています。(たとえば、WordPress のプロファイル設定ページはこのように機能します。)

これら 3 つのパスワード フィールドは、1 つ以上が空白でない場合にのみ検証する必要があります。

my views.pystill で次の操作を行うと、他のフィールドのいずれかにエラーがある場合に、パスワード フィールドのフォーム エラーが発生します。

@sensitive_post_parameters()
@csrf_protect
@login_required
def account(request):
    if request.method == "POST":
        form1 = AccountDetailsForm(request.POST, instance=request.user)
        form2 = AccountPhoneNumber(request.POST, instance=request.user.get_profile())
        form3 = ChangePasswordForm(user=request.user, data=request.POST)
        if form1.is_valid() and form2.is_valid():
            if form3.has_changed():
                if form3.is_valid():
                    form1.save()
                    form2.save()
                    form3.save()
                    messages.success(request, 'Accont Settings and Password Saved.')
                    return redirect('account')
            else:
                form1.save()
                form2.save()
                messages.success(request, 'Account Settings Saved.')
                return redirect('account')
    else:
        form1 = AccountDetailsForm(instance=request.user)
        form2 = AccountPhoneNumber(instance=request.user.get_profile())
        form3 = ChangePasswordForm(user=request.user)
    return render(request, 'account.html', locals())

任意のヒント?ありがとう!

4

1 に答える 1

1

私自身の質問に対する文書化されていない解決策を見つけたようです。以下に示すように、フォームを定義するときにパラメーターとして追加する必要がありempty_permitted=Trueます。

form3 = ChangePasswordForm(user=request.user, data=request.POST, empty_permitted=True)

これにより、元の質問で提供したスニペットのコードの問題がすぐに解決されます。

于 2012-09-22T04:37:52.673 に答える