LoginSignup
7
5

More than 5 years have passed since last update.

Djangoの管理画面で一度の入力で同じデータを複数登録する方法

Last updated at Posted at 2016-08-09

やりたいこと

追加画面に独自フォームを作成して、入力した数だけほぼ同じものを登録できるようにしたい。
追加画面と変更画面でフォームを分けたい

やり方

今回の例では、連番が同じで枝番が違うものを一度の追加で複数登録できるようにする。

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を工夫すれば色々できそうです。
何かあればご指摘ください。

7
5
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
7
5