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)
Back to Top