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

2020/04/23

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

概要

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=''

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

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

avatar

しがないWebエンジニアです。楽しいことをして生きていきたい。ゲームすることとお酒を飲むのが趣味!

項目


© 2022 takap