モデルフォームはとても便利ですが、すこし複雑な処理をするときはどこまでカスタムするかという問題も出てきます。
カスタム沼にはまり込んでしまうより、むしろモデルフォームを使わない方が楽な時があります。
以下は、チェックされた価格が設定されていない本に、まとめて同じ価格を設定するときの例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<form method="post" > {% csrf_token %} <p>500円にする本を選んでください</p> {% for book in form_unpriced_books %} <label> <input name="checked_book" type="checkbox" value="{{ book.id }}" checked="checked" /> {{ book.name }} </label> {% endfor %} <p> <input type="submit" value="保存" /> </p> </form> |
同じnameの複数パラメタは、request.POST.getlistで受け取ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
def UnpricedBooks(request): # 価格が未設定の本をのクエリセット取得モデルフォーム不使用) form_unpriced_books = Books.objects.filter( price=None, ) if request.method == 'GET' : # Getの時の処理 else : # POSTの時の処理 # 入力形式によってはここらへんでバリデーションチェックしたほうが良い with transaction.atomic() : # チェックされた本の価格を500円にする Books.objects.filter( id__in=request.POST.getlist('checked_book') ).update( price=500, ) messages.info(request, f'データを保存しました。') context = { 'form_unpriced_books': form_unpriced_books , } return render(request, "template.html", context) |
参考サイト)