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

Suporte

Instruror boa tarde!

Estou fazendo o curso e paralelamente estou desenvolvendo uma pequena aplicação parecida com a ConnectedIn.

Existe 2 tipos de perfis na minha aplicação: Jornalista e Revisor

O jornalista envia a noticia para o revisor. O revisor edita e aprova a noticia

Estou com dificuldades para criar as classes Perfil e Noticia, poderia me ajudar na logica das 2 classes abaixo:

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) cargo = models.CharField(max_length=255, null=False)

def enviar(self, perfil_jornalista): pass

def receber(self, perfil_editor): pass

class Noticia(models.Model): titulo = models.CharField(max_length=255, null=False) data = models.DateField(null=False) hora = models.TimeField(null=False) conteudo = models.TextField(null=False)

perfis = models.ForeignKey(Perfil) jornalista = models.ForeignKey(Perfil, related_name='noticias_enviadas') editor = models.ForeignKey(Perfil, related_name='noticias_recebidas')

Teria como me ajudar a implementar estas funções para que eu consigo aprovar uma noticia.

Obrigado!

Alysson

14 respostas

Opa! Alysson, formata o código pra mim? Tá difícil de entender sem formatação.

Vi que deixou os métodos vazios, mas onde está sua tentativa de tentar resolvê-los? Tente uma implementação primeiro e poste aqui.

Vi no seu perfil que não concluiu os treinamentos de Python nem o de Django ainda. (Não vi o ícone de conclusão de curso) Seria legal concluir esses cursos primeiros para ficar ainda melhor e ter uma base para resolver a questão bem específica que trouxe.

Flavio, bom dia!

Em primeiro lugar gostaria de parabenizar pela didática e suporte deste curso. Estou bastante assiduo no curso, se tivesse uma contagem de tempo de acesso iria confirmar. Parei no finalzinho, porque estou voltando várias vezes para recordar e fixar.

Estou fazendo várias tentativas de implementar este aplicativo de noticias sem sucesso.

Assim que tiver uma proposta de implementação mais clara eu faço contato novamente.

Obrigado!

Alysson

Flavio, boa tarde!

Implementei as funcionalidades da classe noticia, para editar e adicionar uma noticia, agora preciso elaborar uma lógica para que somente o perfil jornalista possa adicionar uma noticia, e uma lógica para que somente o perfil editor possa editar e aprovar a noticia.

Estou com dificuldades na parte de relacionamento das Perfil com Noticia, já estudei bastante, preciso de uma ajuda.

Tentei colar no ambiente do curso mas desformatou.

Segue o 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) cargo = models.CharField(max_length=255, null=False)

logica responsavel para aprovacao de uma noticia

recebe como parametro uma noticia, a noticia que estamos aprovando

def enviarNoticia(self, perfil_jornalista): noticia = Noticia(solicitante=self, jornalista=perfil_jornalista) noticia.save()

def aprovarNoticia(self, perfil_editor): noticia = Noticia(solicitante=self, editor=perfil_editor) noticia.save()

class Noticia(models.Model): titulo = models.CharField(max_length=255, null=False) data = models.DateField(null=False) hora = models.TimeField(null=False) conteudo = models.TextField(null=False)

O objeto do tipo noticia guarda o perfil do jornalista que enviou a noticia

jornalista = models.ForeignKey(Perfil, related_name='noticias_enviadas')

O objeto do tipo noticia guarda o perfil do editor que aprovou a noticia

editor = models.ForeignKey(Perfil, related_name='noticias_recebidas')

views:

A funcao de view enviarNoticia delegara para o metodo enviarNoticia, da classe Perfil,

a responsabilidade de realizar o envio da noticia.

def enviarNoticia(request, noticia_id): noticia_a_enviar = Noticia.objects.get(id=noticia_id) perfil_logado = get_perfil_logado(request) perfil_logado.enviarNoticia(noticia_a_enviar) return render(request, 'listanoticia.html', {'noticias': Noticia.objects.all()})

A funcao de view aprovarNoticia delegara para o metodo aprovarNoticia, da classe Perfil,

a responsabilidade de realizar uma aprovacao de noticia.

para cada noticia selecionada vamos oferecer a possibilidade de aprova-la

def aprovarNoticia(request, noticia_id): noticia_a_aprovar = Noticia.objects.get(id=noticia_id) perfil_logado = get_perfil_logado(request) perfil_logado.aprovarNoticia(noticia_a_aprovar) return render(request, 'listanoticia.html', {'noticias': Noticia.objects.all()})

Obrigado!

Alysson

Não consigo ler seu código no celular. Vc não usou a formatação de código, aí fica tudo desalinhado. Da uma ajeitadadinha para que possa ler com clareza. (Tem um botão chamado formatação, clique nele para ver como fazer )

Sem ver seu código com clareza a dica é vc testar o cargo (if) nas suas views. Só deixa executar se o cargo é igual ao que você quer. Isso não resolve?

Sobre o término dos cursos, seria melhor você ter concluído totalmente o de PYTHON antes de ter ido para Django, isto é, fazer todos os exercícios e terminar o curso. (Ganha certificado)

Mas eu entendi sua posição sobre ir e voltar, blz

Flavio, bom dia!

Com relação ao curso de PYTHON, pretendo fazer em breve, mas no momento, não tenho condições financeiras.

Gostaria muito que você me ajudasse nesta implemetação da forma mais simples que você puder, sem tomar muito o seu tempo. É uma atividade de pós-graduação que tenho que entregar dia 30/11.

Implementei também as funcionalidades da classe perfil, para editar e adicionar uma perfil, adicionei alguns perfis de jornalista e editor, agora preciso que somente o perfil jornalista possa adicionar uma noticia, e que somente o editor possa editar e aprovar está noticia.

O jornalista tera acesso a listagem de noticias e podera adicionar noticias. O editor tera acesso a listagem de noticias mas não tem a permissão de adicionar, somente editar e aprovar uma noticia, para ser exibida para o visitante.

Tentei testar o cargo (if) nas views, mas não deu, poderia me dizer como fazer isto. Coloquei aspas no inicio e fim dos blocos, não sei se vai dar.Posso enviar o projeto pra você, está funcionando.

O 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) cargo = models.CharField(max_length=255, null=False)'''

'''class Noticia(models.Model): titulo = models.CharField(max_length=255, null=False) data = models.DateField(null=False) hora = models.TimeField(null=False) conteudo = models.TextField(null=False)'''

perfis = models.ManyToManyField(Perfil)

O arquivo views.py:

'''from django.http import HttpResponse from django.shortcuts import render, render_to_response from noticias.models import Noticia, Perfil from django.template import RequestContext from noticias.forms import FormNoticia, FormPerfil'''

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

'''def listaNoticia(request): return render(request, 'listanoticia.html', {'noticias': Noticia.objects.all()})'''

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

'''def exibirNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) return render(request, 'noticia.html', {'noticia': noticia})'''

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

def aprovarNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) return render(request, 'aprovanoticia.html', {'noticia': noticia})

'''def editarNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) if request.method == "POST": form = FormNoticia(request.POST, request.FILES, instance=noticia) if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia(instance=noticia) return render(request, 'editanoticia.html', {'form': form}, context_instance=RequestContext(request))'''

'''def editarPerfil(request, perfil_id): perfil = Perfil.objects.get(id=perfil_id) if request.method == "POST": form = FormPerfil(request.POST, request.FILES, instance=perfil) if form.is_valid(): form.save() return render_to_response('perfilsalvo.html', {}) else: form = FormPerfil(instance=perfil) return render(request, 'editaperfil.html', {'form': form}, context_instance=RequestContext(request))'''

'''def adicionarNoticia(request): if request.method == "POST": form = FormNoticia(request.POST, request.FILES) if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia() return render_to_response('adicionanoticia.html', {'form': form}, context_instance=RequestContext(request))'''

'''def adicionarPerfil(request): if request.method == "POST": form = FormPerfil(request.POST, request.FILES) if form.is_valid(): form.save() return render_to_response('perfilsalvo.html', {}) else: form = FormPerfil() return render_to_response('adicionaperfil.html', {'form': form}, context_instance=RequestContext(request))'''

Você tem até dia 30/11, mas você deve saber que não garanto que vou consegui te responder até essa data, são outros alunos e diversos cursos que cuido aqui. Não posso assumir essa responsabilidade. Aliás, nem seu código consegui ler ainda, porque está todos desformatado e leio na maioria das vezes no celular.

Alyson, você usou aspas para formatar seu código, é backstick, esse aqui que você deve usar. Nas dicas de formatação ele explica como usar.

Sem olhar seu código, como disse na mensagem anterior, faça um IF e verifique o cargo da pessoa. Se ela não tem o cargo que você deseja, não deixe executar a ação. Se ela tem o cargo, você deixar executar a ação. Pegou a ideia? (isso sem eu olhar teu código).

É um IF simples, que você aprende a fazer em Python, lá em lógica de programação. Você pega o perfil e testa se o perfil da pessoa é igual ao que você espera.

Eu também sugiro você pedir ajuda de algo tão específico como seu projeto final da faculdade em

https://groups.google.com/forum/#!forum/django-brasil

E também em

https://www.facebook.com/Django-Brasil-115131068518909/?fref=ts

São três crases que você coloca antes do seu código e três no final.

Antes do código: ```

Final do código: ```

Tudo fica envolvido por isso.

Flavio, boa tarde!

Obrigado pela dica, segue código com a crase. São dois codigos, o models.py e o views.py, não teria como você da o exemplo pratico diretamente no codigo?

O 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) cargo = models.CharField(max_length=255, null=False)

class Noticia(models.Model): titulo = models.CharField(max_length=255, null=False) data = models.DateField(null=False) hora = models.TimeField(null=False) conteudo = models.TextField(null=False)

perfis = models.ManyToManyField(Perfil)

O arquivo views.py:

from django.http import HttpResponse from django.shortcuts import render, render_to_response from noticias.models import Noticia, Perfil from django.template import RequestContext from noticias.forms import FormNoticia, FormPerfil

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

def listaNoticia(request): return render(request, 'listanoticia.html', {'noticias': Noticia.objects.all()})

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

def exibirNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) return render(request, 'noticia.html', {'noticia': noticia})

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

def aprovarNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) return render(request, 'aprovanoticia.html', {'noticia': noticia})

def editarNoticia(request, noticia_id): noticia = Noticia.objects.get(id=noticia_id) if request.method == "POST": form = FormNoticia(request.POST, request.FILES, instance=noticia) if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia(instance=noticia) return render(request, 'editanoticia.html', {'form': form}, context_instance=RequestContext(request))

def editarPerfil(request, perfil_id): perfil = Perfil.objects.get(id=perfil_id) if request.method == "POST": form = FormPerfil(request.POST, request.FILES, instance=perfil) if form.is_valid(): form.save() return render_to_response('perfilsalvo.html', {}) else: form = FormPerfil(instance=perfil) return render(request, 'editaperfil.html', {'form': form}, context_instance=RequestContext(request))

def adicionarNoticia(request): if request.method == "POST": form = FormNoticia(request.POST, request.FILES) if form.is_valid(): form.save() return render_to_response('salvo.html', {}) else: form = FormNoticia() return render_to_response('adicionanoticia.html', {'form': form}, context_instance=RequestContext(request))

def adicionarPerfil(request): if request.method == "POST": form = FormPerfil(request.POST, request.FILES) if form.is_valid(): form.save() return render_to_response('perfilsalvo.html', {}) else: form = FormPerfil() return render_to_response('adicionaperfil.html', {'form': form}, context_instance=RequestContext(request))

Olha, o código está todo desformatado ainda e o Django vai dar erro porque não segui a formatação do Python. Você deve ter cortado e colado o código do post que já estava desformatado, o ideal é colar do seu código do seu projeto e então formatar.

Quando tiver tempo aqui, eu vou pegar seu código, colar em uma arquivo, identar e tentar entender o que ele faz e colocar i if lá.

Muito obrigado Flavio!

Continuo tentando aqui também.

Onde no seu código você tem acesso ao usuário logado? Você precisa dele para saber quem está acessando sua aplicação. Daí fica mais fácil ainda, porque se você quem é o usuário que está acessando seu sistema, o cargo dele (pelo o que eu entendi), você no próprio template do Django pode fazer um IF e exibiras tags com os links ou botões que realizam a ação de acordo com o cargo.

Ficaria assim na sua View, um exemplo:

{% if perfil_logado.cargo == 'EDITOR' %}
   <a> link que aprova ou não uma notícia</a>
{% endif %}}

Veja que com essa solução, você nem precisa alterar seus arquivos view.py. É a forma mais simples que vejo.

Só precisa ter o usuário logado.

Flavio, boa noite!

Ainda não tenho usuario logado na aplicação.

Estou em busca da forma mais facil mesmo, vou tentar esta dica amanhã.

Muito obrigado!

Alysson

Flavio, bom dia!

Conforme sua dica, simulei o perfil logado na classe perfil, fiz o if no link adicionar para somente o perfil com cargo de jornalista possa adicionar,e o if no link editar para que somente o perfil com cargo de editor possa editar.

Porém só esta funcioando para a classe perfil.

Preciso simular o perfil logado na classe de noticia que é o objetivo do projeto, perfil com cargo de jornalista adiciona noticia e perfil com cargo de editor edita a noticia.Não estou sabendo fazer este relacionamento.

views.py

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

Acho que é porque o atributo cargo está na classe Perfil, como eu poderia acessar o atributo cargo da classe perfil para fazer o if nos templates referente a classe noticia:

{% if perfil_logado.cargo == "Jornalista" %} <p><a href="{% url 'adicionarNoticia' %}">Adicionar nova noticia</a></p> {% endif %}

Obrigado pela ajuda que está me dando.

Alysson

solução!

Desculpe Flavio, a simulação de perfil_logado funcionou para a classe Noticia também.

Agora preciso fazer o login/logout real no banco.

Obrigado!

Alysson