1
resposta

Convidar não está funcionando

Olá!

Estou utilizando o Django 1.7, ao tentar criar o relacionamento bidirecional entre Perfil e Convite através dos atributos convites_feitos e convites_recebidos do related_name, vejo que que está ocorrendo algum problema na classe Perfil, que o Convidar não está funcionando.

Explicando melhor:

1. Criei a classe Convite, a função convidar em models.py e relacionei bidirecionalmente as Classes Perfil e Convite através do related_name:

Arquivo models.py

from django.db import models

class Perfil(models.Model):

    nome = models.CharField(max_length=255, null=False)
    email = models.CharField(max_length=255, null=False)     
    telefone = models.CharField(max_length=15, null=False)
    nome_empresa = models.CharField(max_length=255, null=False)

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

class Convite(models.Model):

    solicitante = models.ForeignKey(Perfil, related_name='convites_feitos')
    convidado = models.ForeignKey(Perfil, related_name='convites_recebidos')

2. Criei a função convidar Arquivo views.py

from django.shortcuts import render, redirect
from perfis.models import Perfil


def index(request):
    return render(request, 'index.html', {'perfis': Perfil.objects.all()})

def exibir(request, perfil_id):

        perfil = Perfil.objects.get(id=perfil_id)
        return render(request, 'perfil.html', { "perfil" : perfil })

def convidar(request, perfil_id):
    perfil_a_convidar = Perfil.objects.get(id=perfil_id)
    perfil_logado = get_perfil_logado(request)
    perfil_logado.convidar(perfil_a_convidar)
    return redirect('index')

def get_perfil_logado(request):
    return Perfil.objects.get(id=1)

3. Executei os comandos makemigrates e migrate e inicializei o servidor.

4. Ao testar com a página perfil.html vi que NÃO deu certo o Convidar, não está exibindo nenhum perfil convidado, e ao ir para o shell testar o iterador e verificar se deu certo no banco, deu o erro. Além disso, digitando perfil.convites_feitos, aponta que não existe o atributo, bem como acontece em convites_recebidos:

Iterator que digitei no shell, semelhante ao do vídeo do curso:

from perfis.models import Perfil
  perfil = Perfil.objects.get(id=1)
  for convite in perfil.convites_feitos.all():
    convite.convidado.nome

Traceback (most recent call last): File "", line 1, in AttributeError: 'Perfil' object has no attribute 'convites_feitos'

OBS: Conferi a pasta migrations, os arquivos, bem como os atributos related_named foram criados corretamente.

===============

Já conferi todo o meu código e passos realizados, e não vi erro. Alguém saberia, ou teria sugestão do que há de errado? Como eu poderia resolver? Teria alguma relação com a versão 1.7 do Django?

Por que será que os atributos convites_feitos e convites_recebidos não estão sendo criados dentro da classe Perfil? ou pelo menos não podem ser chamados pelo objeto da classe?

Desde já, agradeço.

1 resposta

Olá analuisafdm, boa noite!

Seu código me parece correto mas parece que o Django não reconheceu as modificações que você fez nos modelos. Veja se todos os arquivos estão salvos antes de executar o python manage.py makemigrations e o python manage.py migrate. E teste novamente.

Caso ainda não dê certo, teria como você enviar seu código para testarmos aqui? Pode zipar a pasta e mandar via link compartilhado do Google Driver ou então via GitHub (que seria melhor).