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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

バリデーション

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

Python

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

Q&A

解決済

2回答

5234閲覧

Django:formの数値を入力するフィールドで範囲を指定して範囲外の値にならないようにしたいです。

shunxile

総合スコア26

Django

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

バリデーション

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

Python

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

0グッド

0クリップ

投稿2021/06/07 05:10

前提・実現したいこと

Djangoを用いて練習でシステム開発を行っています。
ユーザーの登録・編集・一覧表示・削除
こちらの機能を一通り行えるようになったのですが
登録・編集の年齢を入力するフィールドで
フィールド内の右端に出てくる『△』『▽』を押すと
範囲外の値が表示されてしまうのですがどうにかなりますか?

発生している問題・エラーメッセージ

https://gyazo.com/e9a94872ce987bb8e88cc9e22adbbbef
バリデーションとして0<=age<=200としてます。
上記の画像のように0以下の値が表示されてしまいます。

該当のソースコード

model

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(0), 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

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 index(request): 11 return render(request, 'employee/index.html') 12 13def registration(request,id=None): 14 if id: 15 employee = get_object_or_404(User, pk=id) 16 else: 17 employee = User() 18 19 if request.method == 'POST': 20 form = EmployeeForm(request.POST, instance=employee) 21 if form.is_valid(): 22 employee = form.save(commit=False) 23 employee.save() 24 return redirect('employee:registration') 25 else: 26 form = EmployeeForm(instance=employee) 27 28 return render(request, 'employee/registration.html',dict(form=form, id=id)) 29 30def show(request): 31 registration_list = User.objects.all().order_by('id') 32 registration_dict = {'registrations': registration_list} 33 return render(request, 'employee/show.html',context=registration_dict) 34 35def update(request,id=None): 36 if id: 37 employee = get_object_or_404(User, pk=id) 38 else: 39 employee = User() 40 41 if request.method == 'POST': 42 form = EmployeeForm(request.POST, instance=employee) 43 if form.is_valid(): 44 employee = form.save(commit=False) 45 employee.save() 46 return redirect('employee:update',id) 47 else: 48 form = EmployeeForm(instance=employee) 49 50 return render(request, 'employee/update.html',dict(form=form, id=id)) 51 52def delete(request, id): 53 employee = get_object_or_404(User, pk=id) 54 employee.delete() 55 return redirect('employee:show')

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='年齢') 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 or len(employee_name) == 0: 27 raise forms.ValidationError("担当者名の入力が正しくありません") 28 return employee_name 29 30 def clean_age(self): 31 age = self.cleaned_data['age'] 32 if age != None: 33 if age < 0 or age > 200: 34 raise forms.ValidationError("年齢の入力が正しくありません") 35 return age 36 else: 37 raise forms.ValidationError("年齢の入力が正しくありません") 38 39 def clean_sex(self): 40 sex = self.cleaned_data['sex'] 41 if sex != "True" and sex != "False": 42 raise forms.ValidationError("性別を選択してください") 43 return sex 44 45 def clean_department(self): 46 department = self.cleaned_data['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=" "

html

1{% load static %} 2<link rel="stylesheet" type="text/css" href="{% static 'employee/reset.css' %}"> 3<link rel="stylesheet" type="text/css" href="{% static 'employee/style.css' %}"> 4<link rel="stylesheet" type="text/css" href="{% static 'employee/registration.css' %}"> 5 6<div class = top> 7 <h1>登録</h1> 8 9 {% if form.errors %} 10 <div class = "error_list"> 11 {% for errors in form.errors.values %} 12 {% for error in errors %} 13 {{ error }}<br> 14 {% endfor %} 15 {% endfor %} 16 </div> 17 {% endif %} 18 19 <div class = form> 20 <div class = registration-form> 21 <form action="" method="POST" id="registration"> 22 {% csrf_token %} 23 {% for value in form %} 24 <div class = form-content> 25 <p>{{ value.label }}</p> 26 <p>{{ value }}</p> 27 </div> 28 {% endfor %} 29 </form> 30 </div> 31 <div class = move-btn> 32 <div><a href="/employee/" class = btn>メニュー</a></div> 33 <div><button type="submit" form="registration" class="btn">登録</button></div> 34 </div> 35 </div> 36</div> 37

試したこと

https://note.com/shimakaze_soft/n/ncbf8567078f6
https://y0m0r.hateblo.jp/entry/20121030/1351606235
こちらを参考にInterRangeFieldを使ってみましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10
Python3.9.4
Django 3.2.3
VitualStudioCode
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

自己解決

form

1age = forms.IntegerField(required=False,label='年齢')

こちらを次のようにすることで解決しました。

form

1age = forms.IntegerField(required=False,label='年齢',max_value=200,min_value=0)

引数でmax_valueとmin_valueの設定を行うのみでした。お騒がせ致しました。
参考

投稿2021/06/08 01:04

shunxile

総合スコア26

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

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

0

IntegerFIeldにはValidatorをオプションで指定することができます。

python

1age = forms.IntegerField(required=False,label='年齢')

https://docs.djangoproject.com/en/3.2/ref/validators/

ドキュメントの最初に例があるように、自分でValidatorを作ってもいいし、内蔵のValidatorを使ってもいいでしょう。内道を使うなら、MaxValueValidatorとMinValueValidator を両方指定すればいいでしょう。

また、実例は、「django integerfield validator」などで検索するといくつも出てきます。

投稿2021/06/07 07:57

TakaiY

総合スコア13790

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

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

shunxile

2021/06/07 08:11

>>TakaiYさん 回答ありがとうございます。 バリデーションはもともと正常に作動しているのですが 年齢のフィールドでスピナーボタンで0より小さい値や200より大きい値になってしまうのを スピナーボタンを押しても0より小さい値や200より大きい値に ならないようにすることは可能でしょうか? form.pyのageを age = forms.IntegerField(required=False,label='年齢',validators=[validators.MinValueValidator(0), validators.MaxValueValidator(200),]) としても変化はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問