DjangoでDBの値でバリデーションしたい

published
2020-04-23

概要

form等からデータが送られてきて、バリデーションする際に
「あーこいつDBに値あったら処理するけどないならエラー返すわ」
ってしたいとき便利です。

内容

結論から言いますと、Choicefieldを使います。(modelchoicefieldの方)
なんでmodel使うかも流れで説明していきます。

実装

formから値貰うtemplateviewはこんな感じ

from forms import Choice
class Test(TemplateView):
    template_name = 'test.html'

    def get(self, request, *args, **kwargs):
        form = Choice(request.GET)
        if not form.is_valid():
            #エラー処理
        #以下正常処理

formsはこう

ChoiceFieldの場合

from django import forms
from models import *

def get_choice_model_deta():
    choice_data_query = Choice.objects.all()
    Choice_list = choice_data_query.values_list('チェック値', '任意')
    return Choice_list

class Choice(forms.Form):
    form_detail = forms.ChoiceField(choices=get_choice_model_deta())

ちょっとまぁ、嫌ですよね・・・
このためだけにグローバル関数作るのもいけ好かない

実際僕これでマジリク出そうと思ったんですけど、OJTの言葉を思い出しました
「フレームワークがこんなめんどくさいことをさせようとするわけがない」

そ、めんどいことはそれなりの対処がされてるんですよ(標準メソッド漁れ)
(コード統一化+車輪の再発明も防げる)

ModelChoiceFieldの場合

from django import forms
from models import *

class Choice(forms.Form):
    form_detail = forms.ModelChoiceField(queryset=Choice.objects.all())

はい、これだけです。
基本的には、主キーに対してチェックするので、変えたい場合は

to_field_name=''

つけて変えていただければと

後は公式ドキュメントに乗ってるので見ていただければ