概要
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