Django - inlineformset-factory (How to Edit)

2019-07-31 18:05发布

I saw many tutorials and questions in many foruns and websites. And when I search for "inline formset-factory" are many links appear. But few talk about how edit, with inline formset-factory. I have a problem in my project, I did it save, but when I will try edit, rise some errors

This is my code

class Dia_Producao(models.Model):
    id = models.AutoField(primary_key=True)
    diaTrabalho = models.CharField("Dia de Trabalho", choices=DIATRABALHO_CHOICES, blank=True, null=False, max_length=10)
    dataTrabalho = models.DateField("Data de Trabalho")
    fkSemanaMes = models.ForeignKey(Semana_Mes, on_delete=models.CASCADE,verbose_name="Semana do Mês")
    dataCadastro = models.DateTimeField("Data Cadastro", auto_now=False, auto_now_add=True)
    statusBaixa = models.BooleanField("Status Baixa")

    def __str__(self):
        return "%s - %s" %(str(self.diaTrabalho), self.fkSemanaMes)

    def get_absolute_url(self):
        view_name = "dias_trabalho"
        return reverse(view_name)


    class Meta:
        verbose_name_plural="Dia Produções"

class Digi_Usu(models.Model):
    id = models.AutoField(primary_key=True)
    fkDiaProducao = models.ForeignKey(Dia_Producao, verbose_name="Dia Produção")
    fkUsuario = models.ForeignKey(Usuario,on_delete=models.CASCADE, verbose_name="Usuário")
    totalDia = models.IntegerField("Total do Dia")



    def __str__(self):
        return "%s / %s" %(self.fkDiaProducao, self.fkUsuario)

    def __unicode__(self):
        return str(self.fkDiaProducao)

    class Meta:
        verbose_name_plural = "Dia Semana"

class Hora(models.Model):
    hora = models.CharField("Hora Trabalho", choices=HORA_CHOICES, blank=True, null=False,max_length=6)
    qtdlHora = models.IntegerField("Total Hora")
    dataCadastro = models.DateTimeField("Data Cadastro", auto_now=False, auto_now_add=True)
    fkDigiUsu = models.ForeignKey(Digi_Usu, verbose_name="Dia Producao/Usuário")

    def __str__(self):
        return self.hora

    def __unicode__(self):
        return self.hora
    class Meta:
        verbose_name_plural = "Horas"

in my form.py.

HoraFormSet = inlineformset_factory(Digi_Usu,  Hora, fields='__all__', extra=0, max_num=24)

views.py

class DigitalizacaoCreateView(CreateView):

    model = Digi_Usu, Hora, Dia_Producao,Usuario
    template_name = 'producao/digitalizacao/digitalizacao_create.html'
    form_class = DigitalizacaoModelForm

    def get_context_data(self, *args, **kwargs):
        context = super(DigitalizacaoCreateView, self).get_context_data(*args, **kwargs)
        context["title"]= "Lançar Digitalização"
        return context

    def get(self, request, *args, **kwargs):
        self.object  = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        hora_form = HoraFormSet()
        return self.render_to_response(
                self.get_context_data(form=form, hora_form=hora_form)
            )

        def post(self, request, *args, **kwargs):

            self.object = None
            form_class = self.get_form_class()
            form = self.get_form(form_class)
            hora_form = HoraFormSet(self.request.POST)
            if (form.is_valid() and hora_form.is_valid()):
                return self.form_valid(form, hora_form)
            else:
                return self.form_invalid(form, hora_form)

            return
        def form_valid(self, form, hora_form):
            self.object = form.save()
            hora_form.instance = self.object
            hora_form.save()

            return HttpResponseRedirect(self.get_sucess_url())

        def form_invalid(self, form, hora_form):
            return self.render_to_response(self.get_context_data(form=form,
                                                                 hora_form=hora_form))

        def get_sucess_url(self):
            return reverse("digi")

        def get_queryset(self):
            qs = Digi_Usu.objects.all()
            # qs = Hora.objects.filter(fkDigiUsu__fkUsuario__usuario__exact="USUARIO 1", fkDigiUsu__fkDiaProducao__diaTrabalho="01").aggregate(total_itens=Sum('qtdlHora'))
            return qs

class DigitalizacaoUpdateView(UpdateView):
    template_name = 'producao/digitalizacao/digitalizacao_update.html'
    form_class = DigitalizacaoModelForm

    def get_success_url(self):
        return reverse("digi")

    def get_queryset(self):
        #pk = self.kwargs.get("pk")
        qs = Digi_Usu.objects.all()
        return qs

    def get(self, request, *args, **kwargs):
        self.object  = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        hora_form = HoraFormSet(instance=self.object)
        return self.render_to_response(self.get_context_data(
            form=form,
            hora_form=hora_form)
        )

    def post(self, request, *args, **kwargs):

        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        hora_form = HoraFormSet(self.request.POST, self.request.FILES)
        if (form.is_valid() and hora_form.is_valid()):
            return self.form_valid(form, hora_form)
        else:
            return self.form_invalid(form, hora_form)

        return

    def form_valid(self, form, hora_form):
        self.object = form.save(commit=False)
        print(self.object)
        hora_form.instance = self.object
        print(hora_form.instance)
        hora_form.save()

        return HttpResponseRedirect(self.get_sucess_url())


    def form_invalid(self, form, hora_form):
        return self.render_to_response(self.get_context_data(form=form,
                                                             hora_form=hora_form))

template:

<div>
    <div class="entry">
        <form role="form" action="" method="post">

            {% csrf_token %}

            <div class="col-xs-12 col-sm-12 col-md-12  ">
                {{ form|crispy}}
            </div>

            <fieldset>
               <legend>Lançar Horas</legend>
               {{ hora_form.management_form }}
               {{ hora_form.non_form_errors }}
               {% for form in hora_form %}
                   {{ form.id }}
                   <div class="inline {{ hora_form.prefix }}">
                       {{ form.hora.errors }}
                       {{ form.hora.label_tag }}
                       {{ form.hora }}
                       {{ form.qtdlHora.errors }}
                       {{ form.qtdlHora.label_tag }}
                       {{ form.qtdlHora }}
                   </div>
               {% endfor %}
            </fieldset>

            <script type="text/html" id="book-template">
                <div id="hora-__prefix__">
                    {{ hora_form.empty_form }}
                </div>
            </script>
            </div>  <!-- this closing tag ? -->

            <div class="row">
                <div class="col-xs-6 col-md-6 h2"> <p><a href="{% url 'digi' %}" class="btn btn-danger btn-block btn-md" role="button" ><i class=""></i> Voltar</a> </p></div>
                <div class="col-xs-6 col-md-6 h2"> <input class="btn btn-success btn-block btn-md" type="submit" value="Salvar" /> </div>
            </div>

         </form>
    </div>
</div>

error

Environment:

Request Method: POST
Request URL: http://localhost:8000/control/producao/digitalizacao/update/16/

Django Version: 1.10
Python Version: 3.5.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'crispy_forms',
 'djangoformsetjs',
 'dash']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback:

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "/home/douglasm/Documentos/sources/controlsys/src/dash/views.py" in post
  204.             return self.form_valid(form, hora_form)

File "/home/douglasm/Documentos/sources/controlsys/src/dash/views.py" in form_valid
  215.         hora_form.save()

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/forms/models.py" in save
  646.         return self.save_existing_objects(commit) + self.save_new_objects(commit)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/forms/models.py" in save_existing_objects
  765.                 saved_instances.append(self.save_existing(form, obj, commit=commit))

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/forms/models.py" in save_existing
  628.         return form.save(commit=commit)

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/forms/models.py" in save
  448.             self.instance.save()

File "/home/douglasm/Documentos/sources/controlsys/lib/python3.5/site-packages/django/db/models/base.py" in save
  752.                         "unsaved related object '%s'." % field.name

Exception Type: ValueError at /control/producao/digitalizacao/update/16/
Exception Value: save() prohibited to prevent data loss due to unsaved related object 'fkDigiUsu'.

0条回答
登录 后发表回答