1
resposta

TypeError at /registrar/

Após a tentativa de registrar um usuários por meio da rota /registrar/, ocorre-me o seguinte erro:

TypeError at /registrar/
'email' is an invalid keyword argument for this function

Meus arquivos são:

perfis/models.py:

from django.db import models
from django.contrib.auth.models import User

class Perfil(models.Model):
    nome = models.CharField(max_length=255, null=False)
    telefone = models.CharField(max_length=15, null=False)
    nome_empresa = models.CharField(max_length=255, null=False)
    contatos = models.ManyToManyField('self')

    usuario = models.OneToOneField(User, related_name="perfil", on_delete='')

    @property
    def email(self):
        return self.usuario.email

    def convidar(self, usuario_convidado):
        Convite(solicitante=self, convidado=usuario_convidado).save()


class Convite(models.Model):
    solicitante = models.ForeignKey(Perfil, related_name='convites_feitos', on_delete='')
    convidado = models.ForeignKey(Perfil, related_name='convites_recebidos', on_delete='')

    def aceitar(self):
        self.solicitante.contatos.add(self.convidado)
        self.convidado.contatos.add(self.solicitante)
        self.delete()

usuarios/forms.py:

from django import forms
from django.contrib.auth.models import User


class RegistrarUsuarioForm(forms.Form):
    nome = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    senha = forms.CharField(required=True)
    telefone = forms.CharField(required=True)
    nome_empresa = forms.CharField(required=True)

    def is_valid(self):
        valid = True
        if not super(RegistrarUsuarioForm, self).is_valid():
            self.adiciona_erro('Por favor, verifique os dados informados')
            valid = False

        user_exists = User.objects.filter(username=self.data['nome']).exists()
        if user_exists:
            self.adiciona_erro('Usuario ja existente')
            valid = False

        return valid

    def adiciona_erro(self, message):
        errors = self._errors.setdefault(forms.forms.NON_FIELD_ERRORS, forms.utils.ErrorList())
        errors.append(message)

usuarios/views.py:

from django.shortcuts import redirect
from django.shortcuts import render
from django.contrib.auth.models import User
from django.views.generic.base import View
from perfis.models import Perfil
from usuarios.forms import RegistrarUsuarioForm


class RegistrarUsuarioView(View):
    template_name = 'registrar.html'

    def get(self, request):
        return render(request, self.template_name)

    def post(self, request):
        form = RegistrarUsuarioForm(request.POST)

        if form.is_valid():
            dados_form = form.data

            usuario = User.objects.create_user(dados_form['nome'],
                                               dados_form['email'], dados_form['senha'])

            perfil = Perfil(nome=dados_form['nome'],
                            email=dados_form['email'],
                            telefone=dados_form['telefone'],
                            nome_empresa=dados_form['nome_empresa'],
                            usuario=usuario)

            perfil.save()

            return redirect('indexURL')

        return render(request, self.template_name, {'form': form})

E minhas rotas são:

perfis/urls.py:

from django.urls import re_path
from perfis.views import index, exibir, convidar, aceitar

urlpatterns = [
    re_path(r'^$', index, name='indexURL'),
    re_path(r'^perfis/(?P<perfil_id>\d+)$', exibir, name='exibirURL'),
    re_path(r'^perfis/(?P<perfil_id>\d+)/convidar$', convidar, name='convidarURL'),
    re_path(r'^convite/(?P<convite_id>\d+)/aceitar', aceitar, name='aceitarURL'),
]

usuarios/urls.py:

from django.urls import re_path
from usuarios.views import RegistrarUsuarioView

urlpatterns = [
    re_path(r'^registrar/$', RegistrarUsuarioView.as_view(), name="registrarURL")]
1 resposta

Olá Thiago, Em seu arquivo perfis/models.py você tem a classe Perfil, ela no entanto não tem a propriedade e-mail, ainda assim você passa a propriedade e-mail pelo construtor dela no arquivo usuarios/views.py aqui:

perfil = Perfil(nome=dados_form['nome'],
                            email=dados_form['email'],
                            telefone=dados_form['telefone'],
                            nome_empresa=dados_form['nome_empresa'],
                            usuario=usuario)

Neste caso se você colocar email como propriedade o erro deve desaparecer, entendo a melhor opção é passar apenas o usuário ao invés de tentar passar o usuário e o e-mail, assim não há necessidade de mudar a classe perfil.

O def email criou apenas um acessor para a propriedade e-mail do usuário, não significa que a propriedade é do Perfil.