Django - I can no longer save form with dynamic formset
I would like your help with a problem that I can't solve or find a solution on the internet.
I have a user registration form that was working correctly before. But feel the need to insert a dynamic formset.
However, now with the formset when filling out and sending the form, no data is saved in the database and instead of being redirected to a list of users, I am redirected to the form again already filled with the data that failed to be sent and without showing any kind of error.
- models.py
class Contato(models.Model):
tipo = (
('Residencial', 'Residencial'),
('Comercial', 'Comercial'),
('Celular', 'Celular'),
('WhatsApp', 'WhatsApp'),
)
# Contato
email_p = models.EmailField(blank=True, null=True, verbose_name='E-mail pessoal')
email_c = models.EmailField(blank=True, null=True, verbose_name='E-mail corporativo')
proprietario = models.ForeignKey(Perfil, on_delete=models.CASCADE)
tipo_contato = models.CharField(verbose_name='Tipo', choices=tipo, max_length=11, blank=True, null=True)
telefone = models.CharField(max_length=16, blank=True, null=True)
def __str__(self):
return self.proprietario, self.telefone
- forms.py
import datetime
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from Cadastro.models import Local
from django.forms import NumberInput, inlineformset_factory
from Usuarios.models import Contato, Perfil
class UsuarioForm(UserCreationForm):
tipo = (
('Residencial', 'Residencial'),
('Comercial', 'Comercial'),
('Celular', 'Celular'),
('WhatsApp', 'WhatsApp'),
)
contratacao = [(
('CLT', 'CLT'),
('Estagiário', 'Estagiário'),
('Prestador de Serviço (MEI)', 'Prestador de Serviço (MEI)'),
)]
# Dados pessoais
nome_completo = forms.CharField(max_length=150)
nome_mae = forms.CharField(max_length=150, label='Nome do Mãe', required=False)
nome_pai = forms.CharField(max_length=150, label='Nome do Pai', required=False)
cpf = forms.CharField(max_length=15, label='CPF')
rg = forms.CharField(max_length=15, label='RG')
org_exped = forms.CharField(max_length=15, label='Org. Exp')
data_nasc = forms.DateField(label="Dt. de Nascimento", required=True, widget=NumberInput(attrs={'type': 'date'}))
data_emiss = forms.DateField(label="Data de Emissão", required=True, widget=NumberInput(attrs={'type': 'date'}))
# Endereço
logradouro = forms.CharField(max_length=50)
numero_casa = forms.IntegerField(max_value=9999, min_value=0, label='Número', required=False)
complemento_casa = forms.CharField(max_length=10, label='Complemento', required=False)
estado = forms.CharField(max_length=30)
bairro = forms.CharField(max_length=30)
cidade = forms.CharField(max_length=30)
cep = forms.CharField(max_length=15)
# Contato
telefone = forms.CharField(max_length=16)
email_p = forms.EmailField(max_length=100, label='E-mail pessoal')
email_c = forms.EmailField(max_length=100, label='E-mail corporativo')
tipo_contato = forms.ChoiceField(choices=tipo)
dt_cadastro = forms.DateField(label='Dt. de Cadastro', disabled=True, required=False,
widget=NumberInput(attrs={'type': 'date', 'value': datetime.date.today()}))
dt_inicio = forms.DateField(label='Dt. de Inicio', required=False, widget=NumberInput(attrs={'type': 'date'}))
# ForeignKeys
local = forms.ModelChoiceField(queryset=Local.objects.all())
grupo = forms.ModelChoiceField(queryset=Group.objects.all())
class Meta:
model = User
fields = ['username',
'nome_completo',
'rg',
'data_emiss',
'org_exped',
'cpf',
'email',
'data_nasc',
'password1',
'password2',
'grupo',
]
class ContatoForm(forms.ModelForm):
class Meta:
model = Contato
fields = '__all__'
UsuarioFormSet = inlineformset_factory(Perfil, Contato, form=ContatoForm, fields=('tipo_contato', 'telefone'), extra=1)
- views.py
""" Implementando classes para o método de CREATE """
class UsuarioCreate(GroupRequiredMixin, LoginRequiredMixin, SuccessMessageMixin, CreateView):
template_name = 'Cadastro/formulario_usuario.html'
group_required = u"Adminstrador"
form_class = UsuarioForm
success_url = reverse_lazy('listar-usuario')
success_message = "Cadastrado com sucesso"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['titulo'] = 'Registro de novo usuário'
context['botao'] = 'Cadastrar'
if self.request.POST:
context['form'] = UsuarioForm(self.request.POST)
context['contato_form'] = UsuarioFormSet(self.request.POST)
else:
context['form'] = UsuarioForm()
context['contato_form'] = UsuarioFormSet()
return context
def form_valid(self, form):
group = self.request.POST.get('grupo')
grupo = get_object_or_404(Group, id=group)
self.object.groups.add(grupo)
self.object.save()
Perfil.objects.create(
usuario=self.object,
nome_completo=self.request.POST.get('nome_completo'),
cpf=self.request.POST.get('cpf'),
rg=self.request.POST.get('rg'),
org_exp=self.request.POST.get('org_exped'),
telefone=self.request.POST.get('telefone'),
local=self.request.POST.get('local'),
data_nascimento=self.request.POST.get('data_nasc'),
data_emissao=self.request.POST.get('data_emiss'),
nome_mae=self.request.POST.get('nome_mae'),
nome_pai=self.request.POST.get('nome_pai'),
tipo_contato=self.request.POST.get('tipo_contato'),
numero_casa=self.request.POST.get('numero_casa'),
Estado=self.request.POST.get('estado'),
Cidade=self.request.POST.get('cidade'),
Bairro=self.request.POST.get('bairro'),
complemento=self.request.POST.get('complemento_casa'),
dt_cadastro=self.request.POST.get('dt_cadastro'),
dt_inicio=self.request.POST.get('dt_inicio'),
email_p=self.request.POST.get('email_p'),
email_c=self.request.POST.get('email_c'),
)
context = self.get_context_data()
forms = context['form']
formset = context['contato_form']
if forms.is_valid() and formset.is_valid():
self.object = form.save()
forms.instance = self.object
formset.instance = self.object
forms.save()
formset.save()
else:
return self.render_to_response(self.get_context_data(form=form))
return super(UsuarioCreate, self).form_valid(form)