CreateViewやUpdateViewを使うけど、ボタンを押すだけのパターン(保存する値がすでに決まっているパターン)にしたい時とか、一部だけ選択させてそれ以外は決まった値を保存したい時。
たとえば、出退勤を記録するための出勤ボタン/退勤ボタン。
そういうケースでは、そもそもクラスビューを使う必要もなさそうだか、改修時に固定値を1個だけ追加したいとかあるかもしれない。
form_validメソッドをオーバーライドします。
views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic.edit import CreateView, UpdateView from django.utils import timezone from .models import Hoge from .forms import HogeForm """ 登録画面 """ class HogeCreateView(LoginRequiredMixin, CreateView): model = Hoge form_class = HogeForm # form_valid関数をオーバーライドすることで、更新するフィールドと値を指定できる def form_valid(self, form): post = form.save(commit=False) # employeeフィールドはログインしているユーザ名とする post.employee = self.request.user # statusフィールドには1(出勤)を指定する post.status = 1 # 出勤日時。念のためmodelの初期値もtimezone.now()にしといたほうが良いかも post.attendance_at = timezone.now() post.save() return redirect('hoge:top') |
forms.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from django import forms from .models import Hoge # 出勤用 class HogeForm(forms.ModelForm): class Meta: model = Hoge # 今回は保存値がすでに決まっているのでfield,widgetsは不要 # 必要ならばここに追加 fields = ( ) widgets = { } |
hoge_form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{{ form.certifications.errors }} <div class="container"> <form method="post" id="attendance_form"> {%crispy form%} </form> <a id="attendance" class="save" href="#">出勤する</a> </div> <script type="text/javascript"> $(function(){ "use strict"; $('.save').on('click', function (e) { if(!confirm("出勤します。よろしいですか?")){ return false; }; $('.save').addClass('disabled'); $('#attendance_form').submit(); }) }); </script> |
参考サイト)