Q&A
実現したいこと
・checkboxの値がNoneの状態でforms.pyのis_valid()を通したいです.
前提
学習目的でCustomUserモデルを管理するフォームをAdmin無しで作成しております.
一つ詰まってしまった点で, タイトルの通り, checkboxがNoneの場合のみis_valid()がFalseになってしまいます.
・usernameとemailは変更してもis_valid()を通ります.
・問題のis_activeとis_staffも共にTrueであればis_valid()を通ります.
・is_activeとis_staffのいずれかがNoneの場合, is_valid()がFalseとなります.
発生している問題・エラーメッセージ
エラーメッセージは何も出ません.
該当のソースコード
python
1### models.py ### 2 3class User(AbstractBaseUser, PermissionsMixin): 4 username = models.CharField(max_length=50) 5 email = models.EmailField(max_length=150, unique=True) 6 # password = # AbstractBaseUserがフィールドを持つので追記不要. 7 # is_superuser = # PermissionMixinがフィールドを持つので追記不要. 8 is_staff = models.BooleanField(default=False) 9 is_active = models.BooleanField(default=False) 10 create_at = models.DateTimeField(default=datetime.datetime.now()) 11 modified_at = models.DateTimeField(null=True, blank=True) 12 13 USERNAME_FIELD = 'email' 14 REQUIRED_FIELDS = ['username'] 15 16 objects = UserManager() 17 18 def __str__(self): 19 return self.username 20
python
1### forms.py ### 2 3class UpdateuserForm(forms.ModelForm): 4 username = forms.CharField(label='ユーザー名', max_length=50) 5 email = forms.EmailField(label='メールアドレス', max_length=150) 6 is_active = forms.BooleanField() 7 is_staff = forms.BooleanField() 8 9 class Meta(): 10 model = User 11 fields = ('username', 'email', 'is_active', 'is_staff') 12
python
1### views.py ### 2@login_required 3def manage_user(request): 4 obj = User.objects.all() 5 update_user_form = UpdateuserForm(request.POST or None) 6 ctx = { 7 'user_objects': obj, 8 'update_form': update_user_form, 9 } 10 11 if 'user_edit_submit' in request.POST: 12 logger.info({ # logging 13 'action': 'user_edit_submit in request.POST', 14 'status': 'run', 15 'value': { 16 'request.POST: ': request.POST, 17 } 18 }) 19 terget_obj = get_object_or_404(User, id=request.POST['id']) 20 update_user_form = UpdateuserForm(request.POST, instance=terget_obj) 21 22 if update_user_form.is_valid(): 23 logger.info({ # logging 24 'action': 'update_user_form.is_valid()', 25 'status': 'run', 26 'value': { 27 'cleaned_data': update_user_form.cleaned_data 28 } 29 }) 30 update_user_form.save() 31 return redirect('account:manage_user') 32 else: 33 logger.warning({ # logging 34 'action': 'update_user_form.is_valid()', 35 'status': 'failed', 36 'request.POST': request.POST, 37 'message': 'updateformにinstanceを渡していますか?', 38 }) 39 40 return render(request, 'admin/manage_user.html', ctx) 41
html
1{% for user_object in user_objects %} 2 <ul> 3 <li>{{ user_object.username }}</li> 4 <li>...</li> <- リスト表示しているだけなので省略します. -> 5 </ul> 6 <form method="post"> 7 {% csrf_token %} 8 <input type="text" name="username" value="{{ user_object.username }}"> 9 <input type="email" name="email" value="{{ user_object.email }}"> 10 <- 問題のチェックボックスです -> 11 <input type="checkbox" name="is_active" {% if user_object.is_active == True %}checked{% endif %}> 12 <input type="checkbox" name="is_staff" {% if user_object.is_staff == True %}checked{% endif %}> 13 <- ここまで -> 14 <input type="hidden" name="id" value="{{ user_object.id }}"> 15 <input type="submit" name="user_edit_submit" value="変更"> 16 </form> 17{% endfor %}
試したこと
・文字列がいけないのかと思いBoolean型をrequest.POST['is_active']...にrequest.POST._mutableで無理矢理渡しましたが同じ動作(前提に箇条書きした条件の通りの動作です.).
・inputのvalue値で hiddenでFalse, チェックボックスon時でTrueをpostするようにしたところ同じ動作.
・checkboxのcheckedが悪さをしているかと思い外して上記を試したところ同じ動作.
補足情報(FW/ツールのバージョンなど)
docker v4.15 (python:3 のイメージでビルドしております.)
Python 3.11.1
Django 4.1.2
試したことの後3時間ほど調べたのですが, 自力での解決が難しいと考えました.
お力添えくださると幸いです.
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/03/10 08:28
2023/03/10 08:54