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

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

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

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

Python

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

Q&A

解決済

1回答

2948閲覧

【Django】formのバリデーションについて

__tanaka__

総合スコア6

Django

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

Python

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

0グッド

0クリップ

投稿2020/08/22 10:02

前提・実現したいこと

Djangoのformを使用してバリデーションを行おうとしております。
is_valid()がFalseとなってしまい、処理が行えません。
is_valid()をTrueにしたいです。
Templateは関係ありますでしょうか。

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

下記のソースでバリデーションが成功しない。

該当のソースコード

Models

1""" 2ブログテーブル 3ブログが格納される 4""" 5class Blog(models.Model): 6 7 class ModeOfTravel(models.IntegerChoices): 8 abroad = 1 #留学 9 travel = 2 #旅行 10 residing = 3 #在住 11 japan = 4 #日本 12 13 user = models.ForeignKey('User', null=True, on_delete=models.CASCADE, related_name='u_in_b') 14 date_posted = models.DateField(verbose_name='投稿日', null=True, default=datetime.now()) 15 title = models.CharField(max_length=60,verbose_name='タイトル') 16 body = models.CharField(max_length=500,verbose_name='本文') 17 favorite_count = models.IntegerField(null=True, verbose_name='お気に入り数') 18 comment_count = models.IntegerField(null=True, verbose_name='コメント数') 19 city = models.ForeignKey('City', on_delete=models.SET_NULL, null=True, verbose_name='町ID') 20 purpose = models.ForeignKey('Purpose', on_delete=models.SET_NULL, null=True, verbose_name='目的') 21 mode_of_travel = models.IntegerField(choices=ModeOfTravel.choices, null=True, verbose_name='渡航形態') 22 delete_flag = models.BooleanField(default=False, verbose_name='削除フラグ') 23 24""" 25カテゴリマスタテーブル 26""" 27class Category(models.Model): 28 category_code = models.IntegerField(unique=True,verbose_name='カテゴリコード') 29 category_name = models.CharField(max_length=10,verbose_name='カテゴリ名') 30 31""" 32ブログカテゴリテーブル 33ブログに紐づくカテゴリが格納される 34""" 35class BlogCategory(models.Model): 36 blog = models.ForeignKey('Blog', on_delete=models.SET_NULL, null=True, verbose_name='BlogID') 37 category_code = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, verbose_name='カテゴリコード') 38 39""" 40ブログ画像テーブル 41ブログに紐づく画像が格納される 42""" 43class BlogImage(models.Model): 44 image = models.ImageField(upload_to='../blog_img/', verbose_name='BLOG添付画像') 45 blog = models.ForeignKey('Blog', on_delete=models.SET_NULL, null=True, verbose_name='BlogID') 46 47""" 48目的マスタ 49""" 50class Purpose(models.Model): 51 purpose_code = models.IntegerField(unique=True,verbose_name='目的コード') 52 purpose_name = models.CharField(max_length=30,verbose_name='目的')

Form

1from django import forms 2from common.models import User, StudyAbroadInstitution, VisaType, City, Blog, Category, BlogCategory, Purpose, BlogImage 3from django.conf import settings 4from common.util import get_error_message 5 6TRAVEL_CHOICE = ( 7 (1,'留学'), 8 (2,'旅行'), 9 (3,'在住'), 10 (4,'日本') 11) 12 13class BlogAddForm(forms.Form): 14 15 # タイトル 16 title = forms.CharField( 17 label='タイトル', 18 max_length=60, 19 widget=forms.TextInput(), 20 error_messages={ 21 'required': get_error_message(message='required_blog_title'), 22 } 23 ) 24 # 本文 25 body = forms.CharField( 26 label='本文', 27 widget=forms.Textarea(), 28 max_length=500, 29 error_messages={ 30 'required': get_error_message(message='required_blog_body'), 31 } 32 ) 33 # 渡航形態 34 mode_of_travel = forms.ChoiceField( 35 label= '渡航形態', 36 widget=forms.RadioSelect, 37 choices=TRAVEL_CHOICE, 38 initial=1 39 ) 40 # 町 41 city=forms.ChoiceField( 42 label='場所', 43 required=False, 44 widget=forms.CheckboxSelectMultiple 45 ) 46 # 目的 47 purpose=forms.ChoiceField( 48 label='目的', 49 required=False, 50 widget=forms.RadioSelect 51 ) 52 # BLOGカテゴリ 53 category=forms.MultipleChoiceField( 54 label='カテゴリ', 55 required=False, 56 widget=forms.CheckboxSelectMultiple 57 ) 58 # 画像1 59 blog_image_1 = forms.ImageField( 60 label='画像', 61 widget=forms.FileInput(), #あとで 62 required=False, # defであとで定義 63 ) 64 # 画像2 65 blog_image_2 = forms.ImageField( 66 label='画像', 67 widget=forms.FileInput(), #あとで 68 required=False, # defであとで定義 69 ) 70 # 画像3 71 blog_image_3 = forms.ImageField( 72 label='画像', 73 widget=forms.FileInput(), #あとで 74 required=False, # defであとで定義 75 ) 76 # 画像4 77 blog_image_4 = forms.ImageField( 78 label='画像', 79 widget=forms.FileInput(), #あとで 80 required=False, # defであとで定義 81 ) 82 # 画像5 83 blog_image_5 = forms.ImageField( 84 label='画像', 85 widget=forms.FileInput(), #あとで 86 required=False, # defであとで定義 87 ) 88 89 def __init__(self, *args, **kwargs): 90 super().__init__(*args, **kwargs) 91 for field in self.fields.values(): 92 field.widget.attrs["placeholder"] = field.label 93 94 for field in self.fields.values(): 95 field.widget.attrs["autocomplete"] = "off" 96 97 # 町リスト 98 cities = City.objects.all() 99 list = [] 100 for city in cities: 101 list.append((str(city.pk),city.city_name)) 102 self.fields['city'].choices = list 103 104 # カテゴリリスト 105 categories = Category.objects.all() 106 list = [] 107 for category in categories: 108 list.append((str(category.category_code),category.category_name)) 109 self.fields['category'].choices = list 110 111 # 目的リスト 112 purposes = Purpose.objects.all() 113 list = [] 114 for purpose in purposes: 115 list.append((str(purpose.purpose_code),purpose.purpose_name)) 116 self.fields['purpose'].choices = list 117 118 119 # タイトルのバリデーション 120 def clean_title(self): 121 title = self.cleaned_data.get('title') 122 return title 123 124 # 本文のバリデーション 125 def clean_body(self): 126 body = self.cleaned_data.get('body') 127 return body 128 129 # 渡航形態のバリデーション 130 def clean_mode_of_travel(self): 131 mode_of_travel = self.cleaned_data.get('mode_of_travel') 132 return mode_of_travel 133 134 # 添付画像1のバリデーション 135 def clean_blog_image_1(self): 136 blog_image_1 = self.cleaned_data.get('blog_image_1') 137 return blog_image_1 138 139 # 添付画像2のバリデーション 140 def clean_blog_image_2(self): 141 blog_image_2 = self.cleaned_data.get('blog_image_2') 142 return blog_image_2 143 144 # 添付画像3のバリデーション 145 def clean_blog_image_3(self): 146 blog_image_3 = self.cleaned_data.get('blog_image_3') 147 return blog_image_3 148 149 # 添付画像4のバリデーション 150 def clean_blog_image_4(self): 151 blog_image_4 = self.cleaned_data.get('blog_image_4') 152 return blog_image_4 153 154 # 添付画像5のバリデーション 155 def clean_blog_image_5(self): 156 blog_image_5 = self.cleaned_data.get('blog_image_5') 157 return blog_image_5 158 159 def clean(self): 160 cleaned_data = self.cleaned_data 161 162 return cleaned_data 163 164 def get_add_validation_error(self, message): 165 return forms.ValidationError( 166 get_error_message(message=message) 167 )

試したこと

modelのnullを許容しましたが、変わらずでした。

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

Python3.6.8
Django3.0.8
CentOS8.2.2004

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

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

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

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

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

guest

回答1

0

ベストアンサー

バリデーションの結果はform.errorsに記録されています。

デバッグしてform.errorsを確認するか、テンプレートでレンダリング({{ form.errors}})することで確認できます。

投稿2020/08/23 01:48

hasami

総合スコア1277

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

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

__tanaka__

2020/08/29 02:54

確認遅れてしまいもうしわけございません。解決いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問