Exibição similar a Post e Comment, todos em uma página.

17 views
Skip to first unread message

Leonardo Porto

unread,
Oct 28, 2016, 11:10:06 AM10/28/16
to web2py-users-brazil
Boa tarde galera! 
Preciso listar uma perguntas e suas respectivas respostas em uma única página. É bem similar a utilização de blog, com Post e Comment, no meu caso são Ask e Awnsor.

Então estou fazendo a exibição da seguinte forma, através de um For simple na view. O controller é esse aí!

def view_all():
    rows
= db(db.ask).select()
   
return dict(rows=rows)

Awnsor = db.define_table('awnsor',
   
Field('ask_id', 'reference ask', label='Ask Id',writable=False),


Como preciso listar todas as perguntas com seus respectivos comentários em uma única pagina, não tenho como passar um ID especifico pela URL para pegar as respectivas respostas na tabela Awnsor.
Teria alguma solução legal pra isso?
Muito obrigado!
Abrços!

Alexandre Miguel de Andrade Souza

unread,
Oct 29, 2016, 10:28:45 AM10/29/16
to web2py-users-brazil
A idéia básica é você fazer uma consulta na view para cada pergunta


{{for row in rows:}}

   {{=row.ask}}

   {{answers = db(db.answers.ask_id== row.id).select()}}

   {{for answer in answers:}}

      {{answer.answer}}

    {{pass}}
{{pass}}


A ideia básica é essa, mas você vai melhorar a formatação, mais campos, etcx

Alexandre Miguel de Andrade Souza

unread,
Oct 29, 2016, 10:33:53 AM10/29/16
to web2py-users-brazil
A ideia basica é fazer uma consulta na view para cada pergunta.

------------------view------------------------------

....


{{for row in rows:}} #asks

   {{row.ask}}
   {{answers = db(db.answers.ask_id == row.id).select()}}
   {{for answer in answers:}}
       {{=answer.answer}}
   {{pass}}
{{pass}}

A resposta básica é essa, Você pode incrementar a formatação e mais campos.





Em sexta-feira, 28 de outubro de 2016 13:10:06 UTC-2, Leonardo Porto escreveu:

Vinicius Assef

unread,
Oct 29, 2016, 10:45:10 PM10/29/16
to web2py-us...@googlegroups.com
A ideia é boa, mas não acesse dados na view.

Se você já leu sobre o conceito de MVC, nunca faça isso. View
acessando dados é um dos motivos de maior dor de cabeça em sistemas
PHP legados.

Se for para acessar dados, faça no controller. Ou, melhor ainda, em
uma camada de negócios, mas nunca na view.



2016-10-29 12:33 GMT-02:00 Alexandre Miguel de Andrade Souza
<alexand...@gmail.com>:
> --
> Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
> Para enviar uma mensagem ao grupo, envie email a:
> web2py-us...@googlegroups.com
> Para se desinscrever, envie email a:
> web2py-users-br...@googlegroups.com
> Para mais opções, visite o site do grupo em:
> http://groups.google.com/group/web2py-users-brazil?hl=en
> ---
> Você recebeu essa mensagem porque está inscrito no grupo
> "web2py-users-brazil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
> um e-mail para web2py-users-br...@googlegroups.com.
> Para mais opções, acesse https://groups.google.com/d/optout.
Message has been deleted

Marlysson Silva

unread,
Nov 4, 2016, 9:02:06 AM11/4/16
to web2py-users-brazil
"Awnsor" ? Não seria Answer ?

Bom , sobre o que o pessoal falou não é uma boa fazer as buscas na view, o melhor é fazer funções específicas que encapsulam ao máximo essas respostas.

Pode haver uma função de helper por exemplo : anwers_by_ask(id_ask) passando a pergunta e retorna os dados , e na view você faz somente a interação..

O início seria sua função de view_all_asks() que retornaria todas e a partir dela faria o for na view retornando as respostas..

Na função answers_by_ask lá dentro teria um inner join para verificar os pares de dados que casam.. usando um : 

db(db.awnsor.ask_id == ask_id).select() // ask_id é o valor passado como parâmetro da função

Desse modo não faz consulta na view e encapsula o processamento.. 

{{for ask in rows:}}
    
{{for answer in anwers_by_ask(ask.id):}}
        
//listando elas aqui

Vinicius Assef

unread,
Nov 4, 2016, 11:09:26 AM11/4/16
to web2py-us...@googlegroups.com
2016-11-04 11:00 GMT-02:00 Marlysson Silva <marly...@gmail.com>:
>
> Pode haver uma função de helper por exemplo : anwers_by_ask(id_ask) passando
> a pergunta e retorna os dados , e na view você faz somente a interação..
>
> O início seria sua função de view_all_asks() que retornaria todas e a partir
> dela faria o for na view retornando as respostas..

Se você estiver preocupado com a facilidade de manutenção do seu
sistema (incluindo as views) talvez esses textos esclareçam melhor o
assunto:

http://aprenda-python.blogspot.com.br/2016/02/nao-passe-locals-para-o-template.html

http://aprenda-python.blogspot.com.br/2016/02/nao-passe-objetos-aninhados-para-o-template.html

Marlysson Silva

unread,
Nov 4, 2016, 11:15:09 AM11/4/16
to web2py-users-brazil
Vinicius como resolveria? sem usar aninhamento na view..

Vinicius Assef

unread,
Nov 4, 2016, 11:18:58 AM11/4/16
to web2py-us...@googlegroups.com
O controller passar o contexto explícito para a view.

Trocando em miúdos, o controller acessa tudo o que precisa e joga
dentro do dict que vai pra view.

Marlysson Silva

unread,
Nov 4, 2016, 11:25:25 AM11/4/16
to web2py-users-brazil
Certo , seria uma lista de lista por exemplo ou um dicionário de listas no caso .. jogando tudo que precisa lá..
> Para mais opções, visite o site do grupo em:
> http://groups.google.com/group/web2py-users-brazil?hl=en
> ---
> Você recebeu essa mensagem porque está inscrito no grupo
> "web2py-users-brazil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
Reply all
Reply to author
Forward
0 new messages