前提・実現したいこと
フォームから受け取ったクエリの書式が有効かどうかforms.pyで判定し、無効である場合、
raise forms.ValidationError("13桁の半角数字を入力してください。")
を返し、index.htmlにエラーを表示させたいです。
{% for error in form.non_field_errors %} <div class="alert alert-danger"> {{ error }} </div> {% endfor %}
views.pyではフォームとモデルオブジェクトの両方をテンプレートに渡すために、FormViewを継承したクラスの内部に関数**form_valid()とget_context_data()**を定義しています。
発生している問題
FormViewを継承したクラスの内部に**form_valid()とget_context_data()**の両方を定義するとform.non_field_errorsが表示されません。
しかし、**form_valid()**のみを定義した場合、form.non_field_errorsが正しく表示されます。
おそらく**get_context_data()**が悪さをしていると思われますが、改善策がわかりません。
該当のソースコード
forms.py
Python
1from django import forms 2from django.core.exceptions import ValidationError 3 4import unicodedata 5 6from .models import RecordID 7from .scraping import isRightID 8 9class ContactForm(forms.Form): 10 record_id = forms.CharField(label="資料ID") 11 12 def clean(self): 13 cleaned_data = super().clean() 14 text = cleaned_data.get("record_id") 15 try: 16 if len(text) != 13 or isHalfNum(text) != True: 17 raise forms.ValidationError("13桁の半角数字を入力してください。") 18 except: 19 raise forms.ValidationError("13桁の半角数字を入力してください。") 20 return cleaned_data 21 22 def save(self): 23 data = self.cleaned_data 24 recordid = RecordID( 25 record_id = data["record_id"], 26 is_right_label = isRightID(data["record_id"]) 27 ) 28 recordid.save() 29 30def isHalfNum(str): 31 try: 32 int(str) 33 except ValueError: 34 return False 35 else: 36 for char in str: 37 if 'Na' != unicodedata.east_asian_width(char): 38 print("これは全角だ!") 39 return False 40 return True
views.py
Python
1from django.views.generic.edit import FormView, DeleteView 2from django.shortcuts import render, get_object_or_404, redirect 3from django.urls import reverse_lazy 4from django.views.generic import ListView 5 6 7from .forms import ContactForm 8from .models import RecordID 9 10class IndexView(FormView): 11 form_class = ContactForm 12 template_name = 'labelChecker/index.html' 13 success_url = reverse_lazy('labelChecker:index') 14 model = RecordID 15 16 def form_valid(self, form): 17 form.save() 18 super().form_valid(form) 19 20 def get_context_data(self, **kwargs): 21 context = super().get_context_data(**kwargs) 22 context = { 23 'recordid' : RecordID.objects.all() 24 } 25 return context
index.html
HTML
1{% for error in form.non_field_errors %} 2<div class="alert alert-danger"> 3 {{ error }} 4</div> 5{% endfor %}
試したこと
- get_context_data()を使わずにform_valid()の中でモデルオブジェクトをレンダーする
→formが無効の時はモデルオブジェクトが表示されなくなってしまうため×
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。