Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Django - Problemas convites

Ola pessoal. Estou finalizando o modulo/curso do Django, e na parte de convidar contatos nao estou conseguindo visualizar os contatos convidados. Verificando os dados estão no DB, mas não consigo entender porque não esta me listando na pagina. Com certeza deve ser algum pequeno erro/detalhe.

Segue abaixo os códigos, se alguém puder dar um help eu agradeço.

MODELS:
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)
    contatos = models.ManyToManyField('self')

    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')

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

VIEWS:
from django.shortcuts import render
from django.shortcuts import redirect
from perfis.models import Perfil, Convite

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


def aceitar(request, convite_id):
    convite = Convite.objects.get(id=convite_id)
    convite.aceitar()
    return redirect('index')

def exibir(request, perfil_id):
    perfil = Perfil.objects.get(id=perfil_id)
    perfil_logado = get_perfil_logado(request)
    ja_eh_contato = perfil in perfil_logado.contatos.all()
    return render(request, 'perfis.html', {'perfil' : perfil, 'perfil_logado' : get_perfil_logado(request), 'ja_eh_contato' : ja_eh_contato })

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)
    # realizando redirecionamento
    return redirect('index')

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

HTML:
<!-- bloco novo de código que exibe os convites -->
        <div class="panel panel-default">
            {% with total_de_convites=perfil_logado.convites_recebidos.count %}
                {% if total_de_convites %}
                    <div class="panel-heading">
                        <strong>Você tem {{ total_de_convites}} convite{{ total_de_convites|pluralize }} aguardando aprovação</strong>
                    </div>
                    <ul class="list-group">
                        {% for convite in perfil_logado.convites_recebidos.all %}
                            <li class="list-group-item">
                                {{ convite.solicitante.nome }} 
                                <a href="{% url 'aceitar' convite.id %}" class="pull-right">aceitar</a>
                            </li>
                        {% endfor %}
                    </ul>
                {% else %}
                    <div class="panel-body">
                        <p>Nenhum convite recebido :(</p>
                    </div>
                {% endif %}
            {% endwith %}
        </div>
        <!-- fim do bloco novo -->

Abs e obrigado.

3 respostas

Ola pessoal. Estou com outro problema no tópico 11 durante o inserimento/cadastro dos usuários. Apos as modificas me da o erro abaixo:

A mensagem e clara, mas não estou conseguindo resolver. Se alguém puder dar um help, agradeço. Abs

DoesNotExist at /
Perfil matching query does not exist.
Request Method:    GET
Request URL:    http://localhost:8000/
Django Version:    1.7.4
Exception Type:    DoesNotExist
Exception Value:    
Perfil matching query does not exist.
Exception Location:    /Library/Python/2.7/site-packages/django/db/models/query.py in get, line 357
Python Executable:    /usr/bin/python
Python Version:    2.7.10
Python Path:    
['/Users/didio.melo/connectedin',
 '/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages']
Server time:    Sun, 28 May 2017 09:31:27 +0000
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)


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
            #cria o usuario
            usuario = User.objects.create_user(dados_form['nome'], dados_form['email'], dados_form['senha'])
            #cria o perfil
            perfil = Perfil(nome=dados_form['nome'], 
                            telefone=dados_form['telefone'], 
                            nome_empresa=dados_form['nome_empresa'], 
                            usuario=usuario)
            perfil.save()

            #redireciona para index
            return redirect('index')
        return render(request, self.template_name, {'form' : form})
solução!

Oi pessoal. Para esse meu segundo problema, eu resolvi colocando a palavra Perfil em maiúsculo:

usuario = models.OneToOneField(User, related_name='Perfil')

Em relação a minha primeira postagem/problema (visualizar os convites), persiste ainda. Se alguém puder dar um help, agradeço. Obrigado. Abs

Pessoal, recriei e tudo e agora esta funcionando perfeitamente. Apaixonante Python e django, eu que venho do java, me estou divertindo muito. Abs a todos e bons estudos e obrigado pelo help.