やりたいこと
追加画面に独自フォームを作成して、入力した数だけほぼ同じものを登録できるようにしたい。
追加画面と変更画面でフォームを分けたい
やり方
今回の例では、連番が同じで枝番が違うものを一度の追加で複数登録できるようにする。
Model
models.py
from django.db import models
class Job(models.Model):
serial_number = models.IntegerField("連番")
branch_number = models.IntegerField("枝番")
deadline = models.DateField("締切日")
Admin
admin.py
from django.contrib import admin
from django import forms
from .models import Job
#追加時のフォーム
class JobAdminAddForm(forms.ModelForm):
#独自フォーム
number_of_jobs = forms.IntegerField(lable="作業数")
class Meta:
model = Job
fields = ('serial_number', 'deadline')
#変更時のフォーム
class JobAdminChangeForm(forms.ModelForm):
class Meta:
model = Job
fields = ('serial_number', 'branch_number', 'deadline')
class JobAdmin(admin.ModelAdmin):
list_display = ('id', 'serial_number', 'branch_number', 'deadline')
#フォームの切り替え
def get_form(self, request, obj=None, **kwargs):
if obj:#変更時のフォームにJobAdminChangeFormを指定
self.form = JobAdminChangeForm
else:#追加時のフォームにJobAdminAddFormを指定
self.form = JobAdminAddForm
return super().get_form(request, obj, **kwargs)
def save_model(self, request, obj, form, change):
#変更時はそのまま保存
if change:
obj.save()
else:
for i in range(form.cleaned_data['number_of_jobs']):
obj.pk = None
obj.branch_number = i + 1
obj.save()
admin.site.register(Job, JobAdmin)
get_formをオーバーライドして追加時と変更時でフォームを切り替えします。
save_modelをオーバーライドすることで保存時の処理を書き換え可能です。
変更時はそのまま保存するだけで、追加時は独自フォームの値でfor文を回して枝番に値を追加して保存しています。
obj.pkにNoneを代入することでそれぞれ別のデータとして保存できます。
save_modelを工夫すれば色々できそうです。
何かあればご指摘ください。