class FuncionarioCreate(GroupRequiredMixin, LoginRequiredMixin, CreateView):
# defini qual o modelo pra classe
group_required = u"gerente"
model = Funcionario
template_name = "adocao/formulario.html"
# Pra onde redirecionar o usuario depois de inserir
success_url = reverse_lazy("listar-funcionarios")
# quais campos vai aparecer no formulario
fields = ['nome', 'cpf', 'cargo', 'cidade',
'data_contratacao', 'salario', 'email', 'usuario', 'senha', 'observacao']
# metodo ultilizado para enviar dados ao template
def get_context_data(self, *args, **kwargs):
context = super(FuncionarioCreate, self).get_context_data(
*args, **kwargs)
# adiciona coisas ao contextos das coisas
context['titulo'] = "Cadastro de novos funcionarios"
context['botao'] = "Cadastrar"
context['classbotao'] = "btn-success"
return context
def form_valid(self, form):
# Recebe os dados do formulário
senha = form.cleaned_data['senha']
email = form.cleaned_data['email']
usuario = form.cleaned_data['usuario']
cargo = form.cleaned_data['cargo']
# Tenta criar um usuário
try:
user = User.objects.create_user(usuario, email, senha)
# Adicionar o usuário no grupo
if (cargo == "VENDEDOR"):
grupo = Group.objects.get(name='VENDEDOR')
user.groups.add(grupo)
user.save()
# Ou fazer ele um admin/superuser
elif (cargo == "GERENTE"):
grupo = Group.objects.get(name='GERENTE')
user.groups.add(grupo)
user.is_superuser = True
user.save()
except:
# try
user.delete()
# except:
# pass
form.add_error(
None, 'Erro ao tentar cadastrar esse funcionário como usuário.')
return self.form_invalid(form)
# "ligar" o usuário criado com o funcionário que vai ser cadastrado
form.instance.user = user
# Se tudo ocorreu bem, finaliza
return super(FuncionarioCreate, self).form_valid(form)
O problema está nessa linha, quando falha, a instância user não existe. Você precisa se antecipar e previnir isso.