DjangoにてCSVインポート時の例外処理を実装しています。Django及びPython初心者になります。
この度、型の不一致時(IntegerFieldの項目に全角文字を取り込む等)の例外種類であるValueErorrを
キャッチして画面にエラーメッセージ('データに誤りがあります。')を表示させるため、try-except文を記述していますが、
エラー発生箇所が特定できない及びtry-except文の記述が無効な場所として逆に例外(ValidationError)がスローされてしまう
状況に陥っています。
forms.py
import io import csv from django import forms from setting.models import worktypemaster class CSVUploadForm(forms.Form): file = forms.FileField(label='CSVファイル', help_text='※拡張子csvのファイルをアップロードしてください。') def clean_file(self): file = self.cleaned_data['file'] # ファイル名が.csvかどうかの確認 if not file.name.endswith('.csv'): raise forms.ValidationError('拡張子がcsvのファイルをアップロードしてください。') # csv.readerに渡すため、TextIOWrapperでテキストモードなファイルに変換 csv_file = io.TextIOWrapper(file, encoding='cp932') reader = csv.reader(csv_file) # 各行から作った保存前のモデルインスタンスを保管するリスト self._instances = [] try: # 一旦データベースを削除する worktypemaster.objects.all().delete() # idの値として挿入するカウンター i = 1 for row in reader: worktypemaster_db = worktypemaster(id=i, worktypecd=row[0], workcontents=row[1]) self._instances.append(worktypemaster_db) i += 1 except UnicodeDecodeError: raise forms.ValidationError('ファイルのエンコーディングや、正しいCSVファイルか確認ください。') except IndexError: raise forms.ValidationError('項目数が足りないレコード(行)があります。') #↓ここではValuErorrは拾わない except ValueError: raise forms.ValidationError('データに誤りがあります。') return file def save(self): for worktypemaster_db in self._instances: #↓このtry-except文でValidationErrorが発生する try: worktypemaster_db.save() except ValueError: raise forms.ValidationError('データに誤りがあります。')
views.py
class PostImport(generic.FormView): template_name = 'setting/import.html' success_url = reverse_lazy('setting:index') form_class = CSVUploadForm def form_valid(self, form): form.save() return redirect('setting:index')
以上が現状の問題です。CSVインポート時のValueErorrの例外処理の記述方法について、
アドバイス等頂けますでしょうか、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。