1
2

More than 3 years have passed since last update.

[Django] Formからの値の取得

Last updated at Posted at 2021-01-15

実行環境

実行環境は以下の通りです。
Python3 -- Python 3.9.0
Django -- 3.1.3

Djangoで、Formからの値の取得について

今回、Djangoでwebアプリを作成していく際にFormからの値の取得方法に困ったので、メモがてらに記述しておきます。
また、Djangoの学習を始めたばかりで非効率的なコードばかりですが、何かあればご指摘いただければ幸いです。

シチュエーション

Formで選択したオブジェクトの値を取得し、そのオブジェクトのチェックボックスをTrueにするというシチュエーションです。具体的には、事前に登録しているスケジュールをFormで選択し、そのスケジュールを「今月のスケジュール」と設定し、表示するという実装を行いました。

Scheduleのモデルを以下に示します。

models.py
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を作成しました。

forms.py
class ScheduleSelectForm(forms.Form):
    choice = forms.ModelChoiceField(models.Schedule.objects, label='開催年月', empty_label='選択してください')
view.py
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からの値を自由に扱えるようになりました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2