python - DjangoカスタムChangeUserForm設定is_active、is_staff、is_superuserをFalseに設定

python django django-forms django-views

ユーザーが自分のアカウント情報を更新できるようにするカスタムChangeUserForm(ModelForm on User)があります。

ただし、フォームを保存すると、user.is_active、user.is_staff、およびuser.is_superuserがすべてFalseに設定されます。

ここで何が起こっているかについての考えは?

forms.py

class UserChangeForm(forms.ModelForm):
    username = forms.RegexField(label="Username", max_length=30, regex=r'^[\w.@+-]+$',
        help_text = "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
        error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
    first_name = forms.CharField(label="First name", max_length=30)
    last_name = forms.CharField(label="Last name", max_length=30)
    email = forms.EmailField(label="E-mail Address")
    new_password1 = forms.CharField(label="New password", widget=forms.PasswordInput, required=False)
    new_password2 = forms.CharField(label="Confirm new password", widget=forms.PasswordInput, required=False)

    class Meta(auth_forms.UserChangeForm):
        model = User
        exclude = ('password', 'last_login', 'date_joined')

    def clean_new_password2(self):
        password1 = self.cleaned_data.get('new_password1')
        password2 = self.cleaned_data.get('new_password2')

        if password1 != password2:
            raise forms.ValidationError("The two password fields didn't match.")
        else:
            if len(password2) > 0 and len(password2) < 8:
                raise forms.ValidationError("Your password must be a minimum of 8 characters.")
        return password2

    def save(self, commit=True):
        user = super(UserChangeForm, self).save(commit=False)
        if len(self.cleaned_data['new_password2']) > 0:
            user.set_password(self.cleaned_data['new_password2'])
        if commit:
            user.save()
        return user

    class UserProfileForm(forms.ModelForm):
        class Meta:
            model = UserProfile
            exclude = ('user')


views.py

@login_required
def profile(request):
    context = {}
    if request.method == 'POST':
        user_form = UserChangeForm(request.POST, instance = request.user)
        user_profile_form = UserProfileForm(request.POST, instance = request.user.profile)
        if user_form.is_valid() and user_profile_form.is_valid():
            user_form.save()
            user_profile_form.save()

            return render_to_response('accounts_profile_complete.html', context_instance=RequestContext(request))
    else:
        user_form = UserChangeForm(instance = request.user)
        user_profile_form = UserProfileForm(instance = request.user.profile)
    context.update(csrf(request))
    context['user_form'] = user_form
    context['user_profile_form'] = user_profile_form

    return render_to_response('accounts_profile.html', context, context_instance=RequestContext(request))
答え
単なる推測です。これらはMetaクラスの除外リストにないため、falseに設定されています(これらのようなブールフィールドはチェックボックスを使用しますが、チェックされていない場合はPOSTデータに表示されません)。フォームは、ブールフォームフィールドがfalseに設定されていることと、そもそもページにないフォームフィールドとの違いを認識できないため、明示的に除外する必要があります。
関連記事

python - StringToSignの作成

python - 'コマンドラインインテリセンス'(TAB TAB)をPythonスクリプトで動作させる方法は?

python - 自動的にインポートされたモジュールを制御する

python - 書式付きでPythonスクリプトを保存-特殊文字

python - ツイストされた遅延コールバックチェーン

python - JSONからデータを読み込んだ後のメモリのクリーニング

python - クラスが定義されたときに自動登録する(ただし、どこにもインポートしない)

python - Pylonsを初めて使用し、ルートを理解しようとする

python - Pythonでの配列のすべての要素の文字列操作

python - 文字列から日時変数形式