问题
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'.
来源:https://stackoverflow.com/questions/39534543/django-inlineformset-factory-how-to-edit