Django bulk_create CreateView

У меня есть мой models.py

class Schedule(models.Model):
    name = models.CharField(max_length=255)
    date_from = models.DateField('')
    date_to = models.DateField('', null=True)
    desc = models.TextField(blank=True, null=True)

здесь мой views.py

class Schedule(CreateView):
    fields = ()
    model = models.Schedule

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.save()
        return super(ModelFormMixin, self).form_valid(form)

а вот мой template.html

{{form.as_p}}

только эта форма может сделать ввод 1 раз. однако мне нужно выполнить 3 раза ввод в одной форме с другим именем и датой (в моем случае).

и форма может выглядеть

{{form.as_p}}    
{{form.as_p}}
{{form.as_p}}

Я проверяю документацию, которую можно выполнить с помощью функции bulk_create для нескольких вводов за один прогон, но я понятия не имею, что делать с моим template.html

1 ответ

Демо для вас:

views.py

from django import forms
from django.shortcuts import render, HttpResponse
from .models import Schedule


class ScheduleForm(forms.ModelForm):

    class Meta:
        model = Schedule
        fields = "__all__"


def multicreate(request):        
    if request.method == "POST":
        forms = [
            ScheduleForm(dict(name=n, date_from=df, date_to=dt, desc=ds))
            for n, df, dt, ds in zip(
                request.POST.getlist("name"),
                request.POST.getlist("date_from"),
                request.POST.getlist("date_to"),
                request.POST.getlist("desc"),
            )
        ]
        if all(forms[i].is_valid() for i in range(len(forms))):                
            for form in forms:
                form.save() 
            return HttpResponse(
                f"success to create {len(forms)} Schedule instances."
            )
    else:
        forms = [ScheduleForm() for _ in range(3)]
    return render(request, "create.html", {"forms": forms})

models.py

from datetime import date
from django.db import models


class Schedule(models.Model):
    name = models.CharField(max_length=255)
    date_from = models.DateField("date from", default=date.today)
    date_to = models.DateField("date to", default=date.today)
    desc = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.name or self.__class__.__name__

шаблон

<form method='post'>{% csrf_token %}
        {% for form in forms %}
                {{ form.Meta.model }} {{ forloop.counter }}<br>
                {{ form.as_p }}
                -------------------------------------------<br>
        {% endfor %}
<input type='submit', value='OK'>
</form>
Другие вопросы по тегам