前提・実現したいこと
ユーザーの登録で正常な値を送っているはずなのですが
バリデーションに引っかかてしまい保存できません。
期待していた値を取れているのをコンソール上で確認はしています。
なぜ引っかかってしまうのか教えていただきたいです。
入力フォーム
https://gyazo.com/c2360d9731965ef22619bf6e4872b52a
コンソール
https://gyazo.com/e08072d31efe24df3aecca85f66c027a
該当のソースコード
models
1import datetime 2from django.db import models 3from django.utils import timezone 4from django.core import validators 5from django.contrib import admin 6 7class User(models.Model): 8 list_department = [(1,"管理"),(2,"システム開発"),(3,"営業")] 9 list_sex = [(True,"男性"),(False,"女性")] 10 11 employee_name = models.CharField( 12 verbose_name="担当者名", 13 max_length=50, 14 validators=[validators.RegexValidator( 15 regex=u'^[ぁ-んァ-ン一-龥]+$', 16 message='担当者名の入力が正しくありません', 17 )] 18 ) 19 20 age = models.IntegerField( 21 verbose_name="年齢", 22 validators=[validators.MinValueValidator(1), 23 validators.MaxValueValidator(200), 24 validators.RegexValidator( 25 message='年齢の入力が正しくありません', 26 )] 27 ) 28 29 sex = models.BooleanField( 30 verbose_name="性別", 31 choices=list_sex, 32 validators=[validators.RegexValidator( 33 message='性別を選択してください', 34 )] 35 ) 36 37 department = models.IntegerField( 38 verbose_name="部署", 39 choices=list_department, 40 validators=[validators.RegexValidator( 41 message='部署を選択してください', 42 )] 43 ) 44 45 is_use = models.BooleanField(default=True) 46 updated_at = models.DateTimeField(auto_now=True) 47 48 def __str__(self): 49 return self.employee_name 50 def was_published_recently(self): 51 now = timezone.now() 52 return now - datetime.timedelta(days=1) <= self.pub_date <= now 53 54
view
1from django.urls import reverse 2from django.http import HttpResponse, HttpResponseRedirect 3from django.views.decorators.http import require_http_methods 4from django.shortcuts import render,get_object_or_404, redirect 5from django.template import loader 6from .form import EmployeeForm 7 8from .models import User 9 10def registration(request,id=None): 11 if id: 12 employee = get_object_or_404(User, pk=id) 13 else: 14 employee = User() 15 16 if request.method == 'POST': 17 form = EmployeeForm(request.POST, instance=employee) 18 if form.is_valid(): 19 employee = form.save(commit=False) 20 employee.save() 21 return redirect('employee:registration') 22 else: 23 form = EmployeeForm(instance=employee) 24 25 return render(request, 'employee/registration.html',dict(form=form, id=id)) 26 27def update(request,id=None): 28 if id: 29 employee = get_object_or_404(User, pk=id) 30 else: 31 employee = User() 32 33 if request.method == 'POST': 34 form = EmployeeForm(request.POST, instance=employee) 35 if form.is_valid(): 36 employee = form.save(commit=False) 37 employee.save() 38 return redirect('employee:update',id) 39 else: 40 form = EmployeeForm(instance=employee) 41 42 return render(request, 'employee/update.html',dict(form=form, id=id))
form
1from django.db.models import fields 2from employee.models import User 3from django import forms 4from django.forms import ModelForm 5from django.core import validators 6 7list_department = [(0,""),(1,"管理"),(2,"システム開発"),(3,"営業")] 8list_sex = [("start",""),(True,"男性"),(False,"女性")] 9 10class EmployeeForm(ModelForm): 11 class Meta: 12 model = User 13 fields = ('employee_name','age','sex','department') 14 15 employee_name = forms.CharField(required=False,label='担当者名',max_length=50) 16 age = forms.IntegerField(required=False,label='年齢',validators=[validators.MinValueValidator(1), validators.MaxValueValidator(200),]) 17 sex = forms.ChoiceField(required=False,choices=list_sex,label='性別') 18 department = forms.ChoiceField(required=False,choices=list_department,label='部署') 19 20 def clean(self): 21 cleaned_data = super().clean() 22 return cleaned_data 23 24 def clean_employee_name(self): 25 employee_name = self.cleaned_data['employee_name'] 26 if len(employee_name) > 50: 27 raise forms.ValidationError("担当者名の入力が正しくありません") 28 return employee_name 29 30 def clean_age(self): 31 age = self.cleaned_data['age'] 32 if age < 0 or age > 200: 33 raise forms.ValidationError("年齢の入力が正しくありません") 34 return age 35 36 def clean_sex(self): 37 sex = self.cleaned_data['sex'] 38 if sex != "True" and sex != "False": 39 raise forms.ValidationError("性別を選択してください") 40 return sex 41 42 # バリデーションで引っかかるためコメントアウトしてます 43 """ def clean_department(self): 44 department = self.cleaned_data['department'] 45 # コンソールでは管理を選択したときに1と表示されています 46 print(department) 47 if department != 1 and department != 2 and department != 3: 48 raise forms.ValidationError("部署を選択してください") 49 return department """ 50 51 def __init__(self,*args,**kwargs): 52 super().__init__(*args,**kwargs) 53 self.label_suffix=" "
試したこと
数値と数字の違いかと思い条件部分でintにキャスト変換したり
1を"1"にしたりしましたが変わらず部署だけバリデーションに引っかかります
補足情報(FW/ツールのバージョンなど)
Windows10
Python3.9.4
Django 3.2.3
VitualStudioCode
あなたの回答
tips
プレビュー