質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

999閲覧

Django・Python フォームのバリデーションで止められます

shunxile

総合スコア26

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/04 07:06

編集2021/06/04 10:11

前提・実現したいこと

ユーザーの登録で正常な値を送っているはずなのですが
バリデーションに引っかかてしまい保存できません。
期待していた値を取れているのをコンソール上で確認はしています。
なぜ引っかかってしまうのか教えていただきたいです。

入力フォーム
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2021/06/06 03:10

if department != 1 and department != 2 and department != 3: の比較は文字列で行った方がいいかも。 あと、同じ環境をサクッと構築できるようにサンプルを用意しないと、原因となる可能性が多すぎて誰も手をつけないと思いますよ。
dameo

2021/06/06 03:12

試したことではすでにしたことになっているので、ちゃんと書いておくと if department != "1" and department != "2" and department != "3": とか if department not in ["1", "2", "3"]: とかですね
dameo

2021/06/06 03:16

数字に変換して合わせるなら if int(department) not in [1,2,3]:
dameo

2021/06/06 04:03

とりあえず、自分でもサンプル?用意しました。 まずは下のテキストをtmp.zip.base64というファイル名で保存します。 -----BEGIN CERTIFICATE----- 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 AA== -----END CERTIFICATE----- 保存したらコマンドラインから certutil -f -decode "tmp.zip.base64" "tmp.zip" として、tmp.zipを作ります。 このzipファイルを展開して、中のcreate_env.batを実行すればサンプルが出来上がりです。 ただし、中でpatchコマンドを使うために、git-bashが入っていることを前提としています。 Windows版の本家gitを入れれば入るものです。
shunxile

2021/06/06 23:58

>>dameoさん 遅くなり申し訳ありません。 色々とありがとうございます。 こういった質問もまだ慣れてなく、サンプルのことは 全く考えてもいませんでした。 "1"・”2”・"3"としたら通りました。 ありがとうございます。 このパターンも試したつもりだったんですが 抜けていたのかもしれません???? 本当にありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問