Msm form em situações diferentes

28 views
Skip to first unread message

leonardo

unread,
Nov 14, 2012, 1:55:33 PM11/14/12
to django...@googlegroups.com
Pessoal,

Tenho duas situações em que preciso usar exatamente o mesmo form.
Só que em uma, um dos campos é obrigtaório e na outra não.

Conhecem alguma solução para fazer isto sem duplicar o form só por causa de um atributo required=False ?

Abs,

luan fonceca

unread,
Nov 14, 2012, 2:07:48 PM11/14/12
to django...@googlegroups.com
Creio que você possa sobscrever seu o método __init__, que é o construtor, do seu Form, com isso você pode adicionar ao campo desejado o required=False.

def __init__(self, *args, **kwargs):
    super(SeuForm, self).__init__(*args, **kwargs)
        if kwargs.has_key('sua_variavel_de_controle'):
            self.fields['seu_campo'].required = False


Não testei nada, mas acho que seja algo do tipo, "sua_variavel_de_controle", vc passa ela por argumento na sua view que chama o form, quando for o caso do campo não ser required, vc passa ela como parametro pra classe do seu form, algo como:
seu_form = SeuForm(sua_variavel_de_controle=True)

Quando não for esse caso, ou seja, o campo for obrigatório vc faz isso:
seu_form = SeuForm()
Ou seja, não passa a variável.


--
 
 



--
  • Software Engineering student at the Universidade Federal do Rio Grande do Norte;
  • Front-end Designer and Developer;
  • Python/Django Developer at the multmeio.com.br.

Luciano Ramalho

unread,
Nov 14, 2012, 3:19:22 PM11/14/12
to django...@googlegroups.com
2012/11/14 leonardo <leonard...@gmail.com>:
> Tenho duas situações em que preciso usar exatamente o mesmo form.
> Só que em uma, um dos campos é obrigtaório e na outra não.

Então não é "exatamente" o mesmo form ;-)

> Conhecem alguma solução para fazer isto sem duplicar o form só por causa de
> um atributo required=False ?

Que tal usar herança? O form original é uma classe. Crie uma subclasse
apenas para sobrescrever o campo em questão e pronto. Duas linhas de
código, extremamente legível. Não precisa implementar nenhum método.

Foi por situações assim que os inventores da OO inventaram herança.

[ ]s
Luciano

PS. Eu não gosto muito de usar herança com models no Django, porque o
modelo relacional não casa bem com isso, por isso o Django oferece N
maneiras de fazer herança de models, todas mais ou menos
insatisfatórias. Mas no caso de Forms, funciona muito bem.


--
Luciano Ramalho / OFICINAS TURING
Twitter: @ramalhoorg

Autor e professor dos cursos:

* Objetos Pythonicos --> http://turing.com.br/oopy
* Python para quem sabe Python --> http://turing.com.br/ppqsp

leonardo

unread,
Nov 14, 2012, 6:04:25 PM11/14/12
to django...@googlegroups.com
Luciano,

Valeu a solução funcionou mto bem. Isso que é pensar orientado a objetos rs

luan,

Valeu, a solução parece ótima tb. Mas como estou utilizando o CBV FormView, não instancio o form para passar argumento no inicializador.

Abs,

luan fonceca

unread,
Nov 15, 2012, 7:30:25 AM11/15/12
to django...@googlegroups.com
Ata, que bom então a melhor saída é realmente a herança então :D


--
 
 

leonardo

unread,
Nov 15, 2012, 7:21:18 PM11/15/12
to django...@googlegroups.com
Só para constar, descobrir que há sim, como passar argumentos para um form em um CBV FormView.
Fiz assim, para passar o usuário em sessão como parâmetro:

class UserForm(FormView):
    # código 

    def get_form_kwargs(self):
        context = super(UserForm, self).get_form_kwargs()
        context['user'] = self.request.user
        return context

Ou seja, chamando o método get_form_kwargs(). Desta forma, a técnica de luan tb pode ser aplicada.

Abs,
Reply all
Reply to author
Forward
0 new messages