Exemplo de como utilizar o inline formset

254 views
Skip to first unread message

Fellipe Henrique

unread,
Jan 16, 2013, 2:31:56 PM1/16/13
to django...@googlegroups.com
Amigos,

Estou usando o inline do formset para que o usuário possa adicionar os itens no pedido. até aí tudo bem, ele exibe como padrao 3 "linhas"  de itens.. mas para incluir mais 1 tem que salvar tudo e entrar denovo no form.

Minha pergunta é a seguinte, como eu faço pra incluir um novo item no inline sem precisar ter que salvar o form inteiro?

Obrigado.

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)

Gileno Alves

unread,
Jan 16, 2013, 6:19:37 PM1/16/13
to django...@googlegroups.com
Olá Fellipe,

primeiramente você irá precisa de javascript (recomendo a lib jQuery) para que colocar algo parecido com o que tem no Inline do Admin, onde aparece um botão "adicionar outro" e ao clicar aparece outro formulário.

Veja como o formset é renderizado, e perceba como poderá replicar um form específico (seria uma cópia). Depois é preciso fazer um javascript que ao clicar num botão qualquer ou outra coisa apareça outro form de um item, se você percebe o atributo "name" dos forms eles tem uma sequência: 

name="algumacoisa-0-nome_do_campo1"
name="algumacoisa-0-nome_do_campo2"

Nesse javascript é preciso aumentar esse número ai, no caso o: 0 (zero). Para saber qual o número do último form e adicionar +1 para criar o novo form você pode acessar o valor dos inputs do "management" é algo como: "algumacoisa-TOTAL_FORMS".

Pegue o valor deste campo e use-o para o próximo form e depois lembre-se de adicionar +1 neste campo para que django saiba quantos forms você está submetendo

2013/1/16 Fellipe Henrique <fell...@gmail.com>

--
 
 



--
Gileno Filho, Web Developer

Ernesto Guevara

unread,
Jan 16, 2013, 8:41:24 PM1/16/13
to Django Brasil
Você pode ter o mesmo comportamento do formset inline do admin do django na sua app usando este jquery:

http://code.google.com/p/django-dynamic-formset/wiki/Usage

Exemplo de uso traduzindo o "adicionar" e "remover" inlines dinamicamente no formset:

http://pastebin.com/Yu9qubYz


--
 
 

Fellipe Henrique

unread,
Jan 17, 2013, 6:58:05 AM1/17/13
to django...@googlegroups.com
Valeu amigos, muito obrigado.

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


--
 
 

Rodrigo Savian

unread,
Jan 17, 2013, 8:12:59 AM1/17/13
to django...@googlegroups.com
Fellipe,

Postei uma solução que utilizo no pastebin [1], funciona muito bem aqui. Talvez os feras em JS podem melhorar muito o código, mas a idéia é boa, rsrsrs. :D
Neste código utilizo underscore.js [2] e jquery [3]. Qualquer dúvida só pergunta que a gente responde!

Um abraço!

[2] underscore.js - http://underscorejs.org/
[3] jquery - http://jquery.com/

Fellipe Henrique

unread,
Jan 17, 2013, 11:15:23 AM1/17/13
to django...@googlegroups.com
Obrigado amigos, Rodrigo estou usando utilizando seu codigo, e apareceu um outro problema, nada tem a ver com seu código,

quantize result has too many digits for current context

dá erro nessa linha do template:  <td>{{ form.idproduto }}</td>  

Porém, o idproduto é um FK pra um model.

O que pode ser esse erro?



T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)



--
 
 

Fellipe Henrique

unread,
Jan 17, 2013, 11:47:10 AM1/17/13
to django...@googlegroups.com
Rodrigo, agora fui verificar o codigo em si, e quando clico no <a ele não chama a function, eu coloquei o codigo do script dentro de um <script  no inicio da pagina era isso mesmo?  o que pode estar acontecendo de nao chamar a funcao?

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

"Quemadmodum gladius neminem occidit, occidentis telum est." (Epistulae morales ad Lucilium, Lucius Annaeus Seneca)

"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." 
Albert Einstein (March 14th 1879 – April 18th 1955)


Rodrigo Savian

unread,
Jan 17, 2013, 2:08:38 PM1/17/13
to django...@googlegroups.com
o código JS precisa estar assim:
<script>
$(document).ready(function() {
    ... o JS que te passei;
});
</script>

e também pode estar no final da página, seguindo as boas práticas :D
um abraço


Reply all
Reply to author
Forward
0 new messages