[CBV] CreateView x FormView

98 views
Skip to first unread message

Gink Labrev

unread,
Aug 10, 2012, 3:48:50 PM8/10/12
to django...@googlegroups.com
Pessoal,

Estou criando usuário com a seguinte view:

class Signup(FormView):
template_name = 'signup.html'
form_class = SignupForm
success_url = '/signup/'

def form_valid(self, form):
form.save()
return super(Signup, self).form_valid(form)

Duas perguntas:

1) Teria vantagem em usar CreateView ? Apesar de parecer mais apropriado, não compreendi bem a diferença entre os dois.

2) Por que quando uso success_url = reverse ('signup') dá pau na app inteira ? - o name da url é 'signup' mesmo (e faço o import do reverse).

Abs,

Gink Labrev

unread,
Aug 11, 2012, 1:10:22 AM8/11/12
to django...@googlegroups.com
Seja lá qual for, há diferença.
Se substituo o FormView pelo CreateView no código acima, passa a ocorrer o erro __init__() got an unexpected keyword argument 'instance'
Não sei qual a solução ainda.

Gink Labrev

unread,
Aug 11, 2012, 1:53:30 PM8/11/12
to django...@googlegroups.com
Além disso, se faço isso:
class Signup(FormView):
# resto do código
success_url = reverse('signup')

dá erro dizendo que o padrão não corresponde a nenhuma url.
Mas se faço assim:

class Signup(FormView):
# resto do código
def get_success_url(self):
return reverse('signup')

funciona normalmente. Preferia manter o primeiro código.
Tentei com reverse_lazy, que pesquei pela web mas o erro persiste.

É sério que ng aqui sabe ou tem interesse em trocar ideias sobre CBV ?

Gladson Simplicio

unread,
Aug 11, 2012, 4:04:23 PM8/11/12
to django...@googlegroups.com
Eu não conheço, mas esta interessante sua discussão...
Se puder continuar sera de grande ajuda... :D
> --
> Django Brasil em Google Groups
> <http://groups.google.com.br/group/django-brasil>
> Associe-se à Python Brasil e suporte nossa comunidade!
> <http://associacao.python.org.br/>

Ellison Leão

unread,
Aug 11, 2012, 4:26:01 PM8/11/12
to django...@googlegroups.com
Sempre me interessei mas nunca tive oportunidade de fazer um projeto do 0 apenas usando elas. Se alguém tiver oportunidade de mostrar um caso de uso legal, com requests ajax , etc, seria interessante.
--
Ellison Leão
Lattes: http://lattes.cnpq.br/7982148173316833
http://about.me/ellison

Flavia Missi

unread,
Aug 12, 2012, 9:22:05 AM8/12/12
to django...@googlegroups.com
Olá,

A diferença entre a CreateView e a FormView é que a primeira é mais "mastigada", se vc está usando um ModelForm, precisará de menos código com ela, já a FormView renderiza um form qualquer, veja as docs para mais detalhes:

https://docs.djangoproject.com/en/1.4/ref/class-based-views/#django.views.generic.edit.CreateView
https://docs.djangoproject.com/en/1.4/ref/class-based-views/#django.views.generic.edit.FormView

Mais respostas inline:

>> Seja lá qual for, há diferença.
>> Se substituo o FormView pelo CreateView no código acima, passa a ocorrer o
>> erro __init__() got an unexpected keyword argument 'instance'
>> Não sei qual a solução ainda.

Você está usando um ModelForm? Para usar o create view você precisaria ter um...

>>> 1) Teria vantagem em usar CreateView ? Apesar de parecer mais apropriado,
>>> não compreendi bem a diferença entre os dois.

Sim, se você tem um model é mais prático o usar a CreateView, já que essa view foi feita para este fim.


>>> 2) Por que quando uso success_url = reverse ('signup') dá pau na app
>>> inteira ? - o name da url é 'signup' mesmo (e faço o import do reverse).

Deveria funcionar, você pode postar seu urls.py num gist ou similar?

[]s

--
Flavia

Matheus Lima

unread,
Aug 12, 2012, 11:02:28 PM8/12/12
to django...@googlegroups.com
Ellison,

Tem esse exemplo do Luciano Ramalho que é ben didático: https://github.com/acpy/django-ibge/


--
Sent by iPhone.

Gink Labrev

unread,
Aug 15, 2012, 12:22:42 AM8/15/12
to django...@googlegroups.com
Flávia,

Grato pelas explicações. Foi bem elucidativa.

Acho que no meu caso, é melhor msm o FormView, pois não tenho uma relação direta entre o model e o form. 
Por exemplo, tenho um campo user, que registra o usuário em sessão e não aparece no form (embora essa possa ser excluído com exclude) e outro campo horário que é um DateField, mas para o form tenho um campo Date e outro Time para o usuário preencher e depois transformo os dois em um DateTime para armazenamento.

Na verdade, achei para prático um forms.Form personalizado, mas vou tentar com forms.ModelForm só para experiência.

O erro era esse então, pois não passava o ModelForm.

Quanto ao url está assim:

+ projeto
  + projeto
    + urls.py
      - urlpatterns = patterns('',
        ....
        url(r'^', include('app.urls')),
        ...
  + app
    + urls.py
      - urlpatterns = patterns('app.views',
        ....
        url(r'^$', Home.as_view(), name='home'),
        ...
    + views.py
      - class CreatePerson(FormView):
  template_name = 'person.html'
  form_class = PersonForm
  #success_url = reverse_lazy('home') - Dá erro com reverse() tb

  def get_success_url(self):
  return reverse('home') # Funciona


É isso.

Abs,

Gink Labrev

unread,
Aug 15, 2012, 12:24:16 AM8/15/12
to django...@googlegroups.com
 "e outro campo horário que é um DateField, "
leia-se
 "e outro campo horário que é um DateTimeField, "

Gink Labrev

unread,
Aug 15, 2012, 4:23:40 PM8/15/12
to django...@googlegroups.com
Pela thread que o Artur passou + esse link: http://djangosnippets.org/snippets/2445/ [1], pode-se notar que isso é comum em Django CBV.
Alguém sabe por que isso ocorre ? Há algum comentário de algum desenvolvedor Django sobre o motivo deste exceção ?

[1] O link é para <=1.3, em 1.4, deve-se usar o reverse_lazy() para msm efeito, mas este tb não está funcionando.

Em 14 de agosto de 2012 13:57, Artur Felipe Sousa <arturfel...@gmail.com> escreveu:
Parece que o melhor jeito é usar a get_success_url mesmo, mas se você quiser pode usar alguns artifícios:

Reply all
Reply to author
Forward
0 new messages