dropdowns no sqlform.grid

32 views
Skip to first unread message

Leandro Paz

unread,
Jun 9, 2017, 3:38:44 PM6/9/17
to web2py-users-brazil
Boa tarde pessoal, alguém poderia por favor dar alguma dica de como inserir um botão com dropdowns em um SQLForm.grid? 

Gostaria de juntar três botões em um botão "menu". 

Segue o código:


def cadastrar_evento():
    extra_links = [
    lambda row:A('Assistentes', _class="btn btn-primary",_href=URL("assistentes_do_evento",args=[row.id])), 
    lambda row:A('Atividades', _class="btn btn-primary",_href=URL("atividades_do_evento",args=[row.id])), 
    lambda row: A('Avaliadores', _class="btn btn-primary",_href=URL("avaliadores_do_evento",args=[row.id])),
    ]

    grid = SQLFORM.grid(dbevento,
        links=extra_links,
        buttons_placement = 'left',
        fields=[dbevento.id,dbevento.titulo, dbevento.coordenador, dbevento.data_inicio, dbevento.data_fim],
        user_signature=False,csv=False,
        maxtextlength=100,
        #create=False,editable=False, deletable=False,details=False,
        )

    return dict(form = grid)



Sei que o código a seguir retirado do bootstrap inseri um "botão menu" na view, mas como colocar este botão no controller (na opção links do grid)

  1. <div class="btn-group">
  2. <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
  3. Action
  4. <span class="caret"></span>
  5. </a>
  6. <ul class="dropdown-menu">
  7. <!-- dropdown menu links -->
  8. </ul>
  9. </div>

Leandro Paz

unread,
Jun 9, 2017, 6:13:39 PM6/9/17
to web2py-users-brazil
Não aparece os itens do menu, o máximo que consegui foi:

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

#<div class="dropdown">
#  <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">Dropdown Example
#  <span class="caret"></span></button>
#  <ul class="dropdown-menu">
#    <li><a href="#">HTML</a></li>
#    <li><a href="#">CSS</a></li>
#    <li><a href="#">JavaScript</a></li>
#  </ul>
#</div>
    

    aaa=DIV([
        TAG.button('Teste',_class="btn btn-primary dropdown-toggle", _type="button", #_data-toggle="dropdown",
            ),
        SPAN(_class="caret"),
        UL([
            LI(A('Assistentes',_href="#")),
            LI(A('oUTRO TESTE',_href="#"))
            ],_class="dropdown-menu"
            )
        ],_class="dropdown") 

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

quando retiro o comentário de  #_data-toggle="dropdown" dá erro!

Alguém sabe onde estou errando?

Carlos Costa

unread,
Jun 10, 2017, 7:39:55 AM6/10/17
to web2py-us...@googlegroups.com
É por causa do - em data-toggle. A sintaxe do Python não permite esse símbolo em nome de identificador.
Mas nem tudo está perdido.
Você pode passar parêmetros em forma de dicionário em Python.

aaa=DIV([TAG.button('Teste',**{"_class":"btn btn-primary dropdown-toggle", "_type":"button", "_data-toggle":"dropdown"}
                        ),
                         SPAN(_class="caret"),
                         UL([
                            LI(A('Assistentes',_href="#")),
                            LI(A('oUTRO TESTE',_href="#"))
                            ],_class="dropdown-menu"
                           )
             ],_class="dropdown")

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

Carlos Costa

unread,
Jun 10, 2017, 7:40:36 AM6/10/17
to web2py-us...@googlegroups.com
E é uma boa ideia pra fazer no grid. Eu não tinha pensado nisso antes. Obrigado! hehe

Para se desinscrever, envie email a: web2py-users-brazil+unsubscribe...@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-brazil+unsubscribe...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.
--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

Carlos Costa

unread,
Jun 10, 2017, 7:48:04 AM6/10/17
to web2py-us...@googlegroups.com
Acho que também teria que passar o spam pra dentro do buttom pro ícone ficar no lugar certo.
Senão ele fica fora do botão.

    aaa=DIV([TAG.button('Teste', SPAN(_class="caret"),**{"_class":"btn btn-primary dropdown-toggle", "_type":"button", "_data-toggle":"dropdown"}
                        ),
                         UL([
                            LI(A('Assistentes',_href="#")),
                            LI(A('oUTRO TESTE',_href="#"))
                            ],_class="dropdown-menu"
                           )
             ],_class="dropdown")

Leandro Paz

unread,
Jun 10, 2017, 8:47:57 AM6/10/17
to web2py-users-brazil
Obrigado Carlos, ficou ótimo.

Leandro Paz

unread,
Jun 10, 2017, 9:47:12 AM6/10/17
to web2py-users-brazil
Só mais alguns ajustes para o botão ficar com a mesma cara dos demais. O inconveniente é só que nas últimas linha da tabela fica aparecendo a barra de rolagem, será que tem como aumentar uns 10% o height do SQLFORM.grid?


    aaa=SPAN([A('Opções', SPAN(_class="caret"),**{"_class":"btn btn-default dropdown-toggle", "_type":"button", "_data-toggle":"dropdown"}
                    ),
                     UL([
                        LI(A('Assistentes',_href="#")),
                        LI(A('Atividades',_href="#")),
                        LI(A('Avaliadores',_href="#")),

Carlos Costa

unread,
Jun 10, 2017, 10:00:09 AM6/10/17
to web2py-us...@googlegroups.com
Coloca o grid dentro de um div.
Nesse div coloque uma margem adequada na parte inferior (margin-bottom).

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jun 10, 2017, 10:45:48 AM6/10/17
to web2py-users-brazil
Não funcionou o problema é que ao inspecionar o grid vi que tem uma div da class web2py_grid  ela é que deveria receber o style="margin-bottom: 200px;" não sei como mudar isto.

Coloquei assim na view mas não interferiu no grid:

<div style="margin-bottom: 10px">
{{=form}}
</div>

Continua com a barra de rolagem dentro do grid.

Carlos Costa

unread,
Jun 10, 2017, 10:53:57 AM6/10/17
to web2py-us...@googlegroups.com
Cria uma classe com essa borda e passa no _class do .grid()

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jun 10, 2017, 12:00:11 PM6/10/17
to web2py-users-brazil
Ainda não deu só altera a largura, deve ter algo que amarra o height com a quantidade de linhas. Até aumenta o espaço reservado para a tabela, mas quando clica no botão com o dropdown na última linha aparece a barra de rolagem. Será que tem como fazer uma gambiarra e adicionar uma linha fictícia no final da tabela?   

Na view:

<style type="text/css"> 
.minhaclasse{margin-bottom:700px; height:700px;  max-height: 700px; width:700px;}
</style>
{{=grid}}

No SQLFORM.grid: 
_class="web2py_grid minhaclasse"

Carlos Costa

unread,
Jun 12, 2017, 4:53:43 PM6/12/17
to web2py-us...@googlegroups.com
Encontrei a solução e aproveita pra dar uma dica que uso.
Tenho uma configuração padrão dos grids no meu sistema, por isso crei uma função para gerar o grid com meus valores padrões
mas com a possibilidade passar outros parâmetros do próprio grid, caso necessário.
Você pode juntar as duas coisas para não ter que ficar repetindo essa gamb.. ops, essa adaptação técnica toda vez.
Coloco por enquanto essa função em um model de utilidades, mas seria melhor num modulo.

def default_grid(table, **kwargs):
    return SQLFORM.grid(table,
                        create=False,
                        showbuttontext=False,
                        csv=None,
                        **kwargs)

a solução está aqui, limpando o atributo style de um dos divs gerados pelo grid e depois colocando uma margem maior no div externo.
Não encontrei efeito colateral de remover esse style. Se encontrar, avisa a gente.

aaa=DIV([TAG.button('Teste', SPAN(_class="caret"),**{"_class":"btn btn-primary dropdown-toggle", "_type":"button", "_data-toggle":"dropdown"}

                        ),
                         UL([
                            LI(A('Assistentes',_href="#")),
                            LI(A('oUTRO TESTE',_href="#"))
                            ],_class="dropdown-menu"
                           )
             ],_class="dropdown")
grid = default_grid(db.caixa, links=[dict(header='menu',body=lambda row: aaa)])
grid.element('.web2py_htmltable')['_style'] = ''
grid.element('.web2py_grid')['_style'] = 'bottom-margin:200px;'

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jun 12, 2017, 5:32:30 PM6/12/17
to web2py-users-brazil
Deu certinho, mas bastou acrescentar: 
grid.element('.web2py_htmltable')['_style'] = ''

Colocando ou não a linha abaixo não notei diferença.
grid.element('.web2py_grid')['_style'] = 'bottom-margin:200px;'

Mais uma vez obrigado. 

Leandro Paz

unread,
Jun 12, 2017, 5:33:58 PM6/12/17
to web2py-users-brazil
Gostei da ideia de definir uma função para o grid default

Carlos Costa

unread,
Jun 13, 2017, 7:20:00 AM6/13/17
to web2py-us...@googlegroups.com
Verdade. O meu precisou porque tinha mais um div externo. hehe

Em 12 de junho de 2017 18:33, Leandro Paz <leandro....@gmail.com> escreveu:
Gostei da ideia de definir uma função para o grid default

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jun 13, 2017, 2:09:58 PM6/13/17
to web2py-users-brazil
Ficou apresentando um erro ao tentar editar, visualizar ou inserir dados no grid.

Carlos Costa

unread,
Jun 13, 2017, 9:43:41 PM6/13/17
to web2py-us...@googlegroups.com
Eu uso isso em tudo e não dá erro.
Como você fez?

Em 13 de junho de 2017 15:09, Leandro Paz <leandro....@gmail.com> escreveu:
Ficou apresentando um erro ao tentar editar, visualizar ou inserir dados no grid.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jun 14, 2017, 6:34:45 AM6/14/17
to web2py-users-brazil
Tinha feito com em anexo.

Só parou de dar erro chamar os botões de inserir, editar e visualizar do grid. Quando tirei do controller e coloquei assim na view:

{{try:}}
   {{grid.element('.web2py_htmltable')['_style'] = ''}}
{{except:}}
{{pass}}

{{extend 'layout.html'}}

o extend teve que ser depois do try
grid.JPG
erro-inserir.JPG

Carlos Costa

unread,
Jun 14, 2017, 7:20:28 AM6/14/17
to web2py-us...@googlegroups.com
['_style'] está retornando None

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@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-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages