#実行環境
実行環境は以下の通りです。
Python3 -- Python 3.9.0
Django -- 3.1.3
#Djangoで、Formからの値の取得について
今回、Djangoでwebアプリを作成していく際にFormからの値の取得方法に困ったので、メモがてらに記述しておきます。
また、Djangoの学習を始めたばかりで非効率的なコードばかりですが、何かあればご指摘いただければ幸いです。
##シチュエーション
Formで選択したオブジェクトの値を取得し、そのオブジェクトのチェックボックスをTrueにするというシチュエーションです。具体的には、事前に登録しているスケジュールをFormで選択し、そのスケジュールを「今月のスケジュール」と設定し、表示するという実装を行いました。
Scheduleのモデルを以下に示します。
class Schedule(models.Model):
"""スケジュール"""
holdmonth = models.CharField('開催年月', help_text="○年○月", unique=True)
theme = models.TextField('テーマ', max_length=50)
now = models.BooleanField('現在のテーマを選択',default=False)
このモデルのnowというフィールドがTrueのスケジュールを「今月のスケジュール」とします。
設定したいスケジュールを選択するために、以下のようなForm、及びViewを作成しました。
class ScheduleSelectForm(forms.Form):
choice = forms.ModelChoiceField(models.Schedule.objects, label='開催年月', empty_label='選択してください')
def schedule_select(request):
if request.method == "POST":
form = ScheduleSelectForm(request.POST)
if form.is_valid():
selected_schedule = form.cleaned_data.get('choice')
data = Schedule.objects.all().filter(holdmonth=selected_schedule).last()
#他のテーマのチェックを外す
if Schedule.objects.all().filter(now=True).exists():
before_now = Schedule.objects.all().filter(now=True).last()
before_now.now = False
before_now.save(update_fields=['now'])
else:
pass
data.now = True
data.save(update_fields=['now'])
params = {'message': '教室スケジュール', 'data': data}
return render(request, 'MySite/admin_page.html', params)
else:
form = ScheduleSelectForm()
context = {'form':form}
return render(request, 'MySite/schedule_select.html', context)
Formで選択した
selected_schedule = form.cleaned_data.get('choice')
とすることで、Formで選択した値を取得できます。
○○.is_valid() で、フォームに入力された値にエラーがないかバリデートを行い、
○○.cleaned_data('フィールド名') で、バリデート後のデータを型に応じて整形して返すようです。
これらのを理解しておらず、なかなかFormで選択した値を取得できませんでしたが、上記のメソッドでFormからの値を自由に扱えるようになりました。