Estou como uma dúvida referente à adição de um campo de cadastro de vendedores dentro do cadastro de fornecedores que estou fazendo em meu fork, fiz ele baseado no campo de cadastro de veículos em transportadoras. O código de cadastro está funcionando normalmente, mas o que usa a view editar está com um erro referente ao ManagementForm, o código atualmente está e em seguida o erro. Sei que é muita coisa, mas se puder me ajudar serei grato, estou há quase um mês com essa dúvida e não estou conseguindo resolver:
Model
# -*- coding: utf-8 -*-
from django.db import models
from .base import Pessoa
class Fornecedor(Pessoa):
class Meta:
verbose_name = "Fornecedor"
class Vendedor(models.Model):
fornecedor_vendedor = models.ForeignKey(
'cadastro.Fornecedor', related_name="vendedor", on_delete=models.CASCADE)
nome = models.CharField(max_length=255, blank=True, null=True)
telefone = models.CharField(max_length=255, blank=True, null=True)
email = models.CharField(max_length=255, blank=True, null=True)
def __unicode__(self):
return u'%s / %s / %s' % (self.nome, self.telefone, self.email)
def __str__(self):
return u'%s / %s / %s' % (self.nome, self.telefone, self.email)
def get_telefone_apenas_digitos(self):
return self.telefone.replace('(', '').replace(' ', '').replace(')', '').replace('-', '')
View Fornecedor
# -*- coding: utf-8 -*-
from django.urls import reverse_lazy
from masterpy.apps.cadastro.forms import FornecedorForm
from masterpy.apps.cadastro.forms.fornecedor import VendedorFormSet
from masterpy.apps.cadastro.models import Fornecedor, Vendedor
from .base import AdicionarPessoaView, PessoasListView, EditarPessoaView
class AdicionarFornecedorView(AdicionarPessoaView):
template_name = "cadastro/pessoa_add.html"
success_url = reverse_lazy('cadastro:listafornecedoresview')
success_message = "Fornecedor <b>%(nome_razao_social)s </b>adicionado com sucesso."
permission_codename = 'add_fornecedor'
def get_context_data(self, **kwargs):
context = super(AdicionarFornecedorView,
self).get_context_data(**kwargs)
context['title_complete'] = 'CADASTRAR FORNECEDOR'
context['return_url'] = reverse_lazy('cadastro:listafornecedoresview')
context['tipo_pessoa'] = 'fornecedor'
return context
def get(self, request, *args, **kwargs):
form = FornecedorForm(prefix='fornecedor_form')
vendedor_form = VendedorFormSet(prefix='vendedor_form')
vendedor_form.can_delete = False
return super(AdicionarFornecedorView, self).get(
request, form, vendedor_form=vendedor_form, *args, **kwargs)
def post(self, request, *args, **kwargs):
form = FornecedorForm(request.POST, request.FILES, prefix='fornecedor_form', request=request)
vendedor_form = VendedorFormSet(request.POST, prefix='vendedor_form')
return super(AdicionarFornecedorView, self).post(
request, form, vendedor_form=vendedor_form, *args, **kwargs)
class FornecedoresListView(PessoasListView):
template_name = 'cadastro/pessoa_list.html'
model = Fornecedor
context_object_name = 'all_fornecedores'
success_url = reverse_lazy('cadastro:listafornecedoresview')
permission_codename = 'view_fornecedor'
def get_context_data(self, **kwargs):
context = super(FornecedoresListView, self).get_context_data(**kwargs)
context['title_complete'] = 'FORNECEDORES CADASTRADOS'
context['add_url'] = reverse_lazy('cadastro:addfornecedorview')
context['tipo_pessoa'] = 'fornecedor'
return context
class EditarFornecedorView(EditarPessoaView):
form_class = FornecedorForm
model = Fornecedor
template_name = "cadastro/pessoa_edit.html"
success_url = reverse_lazy('cadastro:listafornecedoresview')
success_message = "Fornecedor <b>%(nome_razao_social)s </b>editado com sucesso."
permission_codename = 'change_fornecedor'
def get_context_data(self, **kwargs):
context = super(EditarFornecedorView, self).get_context_data(**kwargs)
context['return_url'] = reverse_lazy('cadastro:listafornecedoresview')
context['tipo_pessoa'] = 'fornecedor'
return context
def get(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form_class.prefix = "fornecedor_form"
form = self.get_form(form_class)
vendedor_form = VendedorFormSet(
instance=self.object, prefix='veiculo_form')
if Vendedor.objects.filter(
fornecedor_vendedor=self.object.pk).count():
vendedor_form.extra = 0
return super(
EditarFornecedorView, self).get(
request, form, vendedor_form=vendedor_form, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = form_class(request.POST, request.FILES,
prefix='fornecedor_form',
instance=self.object, request=request)
vendedor_form = VendedorFormSet(
request.POST, prefix='vendedor_form', instance=self.object)
return super(EditarFornecedorView, self).post(
request, form, vendedor_form=vendedor_form, *args, **kwargs)
View Base
# -*- coding: utf-8 -*-
from masterpy.apps.base.custom_views import CustomCreateView, CustomListView, CustomUpdateView
from masterpy.apps.cadastro.forms import PessoaJuridicaForm, PessoaFisicaForm, EnderecoFormSet, TelefoneFormSet, EmailFormSet, \
SiteFormSet, BancoFormSet, DocumentoFormSet
from masterpy.apps.cadastro.models import PessoaFisica, PessoaJuridica, Endereco, Telefone, Email, Site, Banco, Documento
class AdicionarPessoaView(CustomCreateView):
def get_success_message(self, cleaned_data):
return self.success_message % dict(cleaned_data, nome_razao_social=self.object.nome_razao_social)
def get(self, request, form, *args, **kwargs):
self.object = None
veiculo_form = kwargs.pop('veiculo_form', None)
vendedor_form = kwargs.pop('vendedor_form', None)
pessoa_juridica_form = PessoaJuridicaForm(prefix='pessoa_jur_form')
pessoa_fisica_form = PessoaFisicaForm(prefix='pessoa_fis_form')
endereco_form = EnderecoFormSet(prefix='endereco_form')
endereco_form.can_delete = False
banco_form = BancoFormSet(prefix='banco_form')
banco_form.can_delete = False
documento_form = DocumentoFormSet(prefix='documento_form')
documento_form.can_delete = False
telefone_form = TelefoneFormSet(prefix='telefone_form')
email_form = EmailFormSet(prefix='email_form')
site_form = SiteFormSet(prefix='site_form')
formsets = [telefone_form, email_form, site_form]
for formset in formsets:
formset.can_delete = False
return self.render_to_response(self.get_context_data(form=form,
pessoa_juridica_form=pessoa_juridica_form,
pessoa_fisica_form=pessoa_fisica_form,
endereco_form=endereco_form,
banco_form=banco_form,
documento_form=documento_form,
formsets=formsets,
vendedor_form=vendedor_form,
veiculo_form=veiculo_form))
def post(self, request, form, *args, **kwargs):
self.object = None
extra_forms = []
veiculo_form = kwargs.pop('veiculo_form', None)
vendedor_form = kwargs.pop('vendedor_form', None)
endereco_form = EnderecoFormSet(request.POST, prefix='endereco_form')
banco_form = BancoFormSet(request.POST, prefix='banco_form')
documento_form = DocumentoFormSet(
request.POST, prefix='documento_form')
telefone_form = TelefoneFormSet(request.POST, prefix='telefone_form')
email_form = EmailFormSet(request.POST, prefix='email_form')
site_form = SiteFormSet(request.POST, prefix='site_form')
formsets = [telefone_form, email_form, site_form]
if veiculo_form:
extra_forms = [veiculo_form, ]
if vendedor_form:
extra_forms = [vendedor_form, ]
if form.is_valid():
self.object = form.save(commit=False)
if self.object.tipo_pessoa == 'PJ':
pessoa_form = PessoaJuridicaForm(
request.POST, prefix='pessoa_jur_form')
else:
pessoa_form = PessoaFisicaForm(
request.POST, prefix='pessoa_fis_form')
if (all(formset.is_valid() for formset in formsets) and
pessoa_form.is_valid() and
endereco_form.is_valid() and
banco_form.is_valid() and
documento_form.is_valid() and
all(extra_form.is_valid() for extra_form in extra_forms)):
self.object.save()
# Salvar informacoes endereco
endereco_form.instance = self.object
end = endereco_form.save()
if len(end):
self.object.endereco_padrao = end[0]
# Salvar informacoes bancarias
banco_form.instance = self.object
ban = banco_form.save()
if len(ban):
self.object.banco_padrao = ban[0]
# Salvar documentos adicionais
documento_form.instance = self.object
documento_form.save()
# salvar telefone
telefone_form.instance = self.object
tel = telefone_form.save()
if len(tel):
self.object.telefone_padrao = tel[0]
# salvar email
email_form.instance = self.object
ema = email_form.save()
if len(ema):
self.object.email_padrao = ema[0]
# salvar site
site_form.instance = self.object
sit = site_form.save()
if len(sit):
self.object.site_padrao = sit[0]
if veiculo_form:
veiculo_form.instance = self.object
veiculo_form.save()
if vendedor_form:
vendedor_form.instance = self.object
vendedor_form.save()
# salvar objeto criado e pessoa fisica/juridica
self.object.save()
pessoa_form.instance.pessoa_id = self.object
pessoa_form.save()
return self.form_valid(form)
pessoa_juridica_form = PessoaJuridicaForm(
request.POST, prefix='pessoa_jur_form')
pessoa_fisica_form = PessoaFisicaForm(
request.POST, prefix='pessoa_fis_form')
return self.form_invalid(form=form,
pessoa_juridica_form=pessoa_juridica_form,
pessoa_fisica_form=pessoa_fisica_form,
endereco_form=endereco_form,
banco_form=banco_form,
documento_form=documento_form,
formsets=formsets,
vendedor_form=vendedor_form,
veiculo_form=veiculo_form)
class PessoasListView(CustomListView):
def __init__(self, *args, **kwargs):
super(PessoasListView, self).__init__(*args, **kwargs)
class EditarPessoaView(CustomUpdateView):
def get_success_message(self, cleaned_data):
return self.success_message % dict(cleaned_data, nome_razao_social=self.object.nome_razao_social)
def get(self, request, form, *args, **kwargs):
if self.object.tipo_pessoa == 'PJ':
pessoa_juridica_form = PessoaJuridicaForm(
instance=self.object, prefix='pessoa_jur_form')
pessoa_fisica_form = PessoaFisicaForm(prefix='pessoa_fis_form')
else:
pessoa_juridica_form = PessoaJuridicaForm(prefix='pessoa_jur_form')
pessoa_fisica_form = PessoaFisicaForm(
instance=self.object, prefix='pessoa_fis_form')
endereco_form = EnderecoFormSet(
instance=self.object, prefix='endereco_form')
banco_form = BancoFormSet(instance=self.object, prefix='banco_form')
documento_form = DocumentoFormSet(
instance=self.object, prefix='documento_form')
telefone_form = TelefoneFormSet(
instance=self.object, prefix='telefone_form')
email_form = EmailFormSet(instance=self.object, prefix='email_form')
site_form = SiteFormSet(instance=self.object, prefix='site_form')
if Telefone.objects.filter(pessoa_tel=self.object.pk).count():
telefone_form.extra = 0
if Endereco.objects.filter(pessoa_end=self.object.pk).count():
endereco_form.extra = 0
if Email.objects.filter(pessoa_email=self.object.pk).count():
email_form.extra = 0
if Site.objects.filter(pessoa_site=self.object.pk).count():
site_form.extra = 0
if Banco.objects.filter(pessoa_banco=self.object.pk).count():
banco_form.extra = 0
if Documento.objects.filter(pessoa_documento=self.object.pk).count():
documento_form.extra = 0
formsets = [telefone_form, email_form, site_form]
# Caso Empresa
logo_file = kwargs.pop('logo_file', None)
# Caso Transportadora
veiculo_form = kwargs.pop('veiculo_form', None)
# Caso Fornecedor
vendedor_form = kwargs.pop('vendedor_form', None)
return self.render_to_response(self.get_context_data(form=form,
pessoa_juridica_form=pessoa_juridica_form,
pessoa_fisica_form=pessoa_fisica_form,
endereco_form=endereco_form,
banco_form=banco_form,
documento_form=documento_form,
formsets=formsets,
logo_file=logo_file,
vendedor_form=vendedor_form,
veiculo_form=veiculo_form,
object=self.object))
def post(self, request, form, *args, **kwargs):
self.object = self.get_object()
extra_forms = []
veiculo_form = kwargs.pop('veiculo_form', None)
vendedor_form = kwargs.pop('vendedor_form', None)
endereco_form = EnderecoFormSet(
request.POST, prefix='endereco_form', instance=self.object)
banco_form = BancoFormSet(
request.POST, prefix='banco_form', instance=self.object)
documento_form = DocumentoFormSet(
request.POST, prefix='documento_form', instance=self.object)
telefone_form = TelefoneFormSet(
request.POST, prefix='telefone_form', instance=self.object)
email_form = EmailFormSet(
request.POST, prefix='email_form', instance=self.object)
site_form = SiteFormSet(
request.POST, prefix='site_form', instance=self.object)
formsets = [telefone_form, email_form, site_form]
if veiculo_form:
extra_forms = [veiculo_form, ]
if vendedor_form:
extra_forms_vendedor = [vendedor_form, ]
if form.is_valid():
self.object = form.save(commit=False)
if self.object.tipo_pessoa == 'PJ':
pessoa_form = PessoaJuridicaForm(
request.POST, prefix='pessoa_jur_form')
else:
pessoa_form = PessoaFisicaForm(
request.POST, prefix='pessoa_fis_form')
if (all(formset.is_valid() for formset in formsets) and
pessoa_form.is_valid() and
endereco_form.is_valid() and
banco_form.is_valid() and
documento_form.is_valid() and
all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and
all(extra_form.is_valid() for extra_form in extra_forms)):
self.object = form.save(commit=False)
self.object.save()
if self.object.tipo_pessoa == 'PJ':
# Remover pessoa fisica da DB se existir
PessoaFisica.objects.filter(
pessoa_id=self.object.pk).delete()
else:
# Remover pessoa juridica da DB se existir
PessoaJuridica.objects.filter(
pessoa_id=self.object.pk).delete()
# Salvar informacoes endereco
endereco_form.instance = self.object
end = endereco_form.save()
if len(end):
self.object.endereco_padrao = end[0]
# Salvar informacoes bancarias
banco_form.instance = self.object
ban = banco_form.save()
if len(ban):
self.object.banco_padrao = ban[0]
# Salvar documentos adicionais
documento_form.instance = self.object
documento_form.save()
# Salvar telefone
telefone_form.instance = self.object
tel = telefone_form.save()
if len(tel):
self.object.telefone_padrao = tel[0]
# Salvar email
email_form.instance = self.object
ema = email_form.save()
if len(ema):
self.object.email_padrao = ema[0]
# Salvar site
site_form.instance = self.object
sit = site_form.save()
if len(sit):
self.object.site_padrao = sit[0]
if veiculo_form:
veiculo_form.instance = self.object
veiculo_form.save()
if vendedor_form:
vendedor_form.instance = self.object
vendedor_form.save()
# salvar objeto criado e pessoa fisica/juridica
self.object.save()
pessoa_form.instance.pessoa_id = self.object
pessoa_form.save()
return self.form_valid(form)
logo_file = kwargs.pop('logo_file', None)
if self.object.tipo_pessoa == 'PJ':
pessoa_juridica_form = PessoaJuridicaForm(
request.POST, prefix='pessoa_jur_form', instance=self.object)
pessoa_fisica_form = PessoaFisicaForm(
request.POST, prefix='pessoa_fis_form')
else:
pessoa_juridica_form = PessoaJuridicaForm(
request.POST, prefix='pessoa_jur_form')
pessoa_fisica_form = PessoaFisicaForm(
request.POST, prefix='pessoa_fis_form', instance=self.object)
return self.form_invalid(form=form,
pessoa_juridica_form=pessoa_juridica_form,
pessoa_fisica_form=pessoa_fisica_form,
endereco_form=endereco_form,
banco_form=banco_form,
documento_form=documento_form,
formsets=formsets,
vendedor_form=vendedor_form,
veiculo_form=veiculo_form,
logo_file=logo_file)
Erro
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/cadastro/fornecedor/editar/3/
Django Version: 2.2.2
Python Version: 3.5.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'masterpy.apps.base',
'masterpy.apps.login',
'masterpy.apps.cadastro',
'masterpy.apps.vendas',
'masterpy.apps.compras',
'masterpy.apps.fiscal',
'masterpy.apps.financeiro',
'masterpy.apps.estoque']
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',
'masterpy.middleware.LoginRequiredMiddleware']
Traceback:
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/base/views_mixins.py" in dispatch
34. return super(CheckPermissionMixin, self).dispatch(request, *args, **kwargs)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
97. return handler(request, *args, **kwargs)
File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/fornecedor.py" in post
96. request, form, vendedor_form=vendedor_form, *args, **kwargs)
File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/base.py" in post
271. all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and
File "/home/lgustav/PycharmProjects/masterpy/masterpy/apps/cadastro/views/base.py" in
271. all(extra_forms_vendedor.is_valid() for extra_forms_vendedor in extra_forms_vendedor) and
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in is_valid
301. self.errors
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in errors
281. self.full_clean()
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in full_clean
322. for i in range(0, self.total_form_count()):
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in total_form_count
110. return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/utils/functional.py" in get
80. res = instance.dict[self.name] = self.func(instance)
File "/home/lgustav/PycharmProjects/masterpy/venv/lib/python3.5/site-packages/django/forms/formsets.py" in management_form
92. code='missing_management_form',
Exception Type: ValidationError at /cadastro/fornecedor/editar/3/
Exception Value: ['Os dados do ManagementForm não foram encontrados ou foram adulterados']