前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/29 02:54