[pyar] [django] Form & FormView

Claudio Omar Melendrez Baeza claudio.melendrez en gmail.com
Lun Oct 21 17:33:15 ART 2013


Los campos en el constructor los tenes en el dictionary "fields". Seria *
self.fields['author']* en lugar de *self.author*.
Por otro lado yo recomendaria siempre usar kwargs para pasar parametros al
formulario... asi no te preocupas por posiciones y demas (que cuando pasas
POSTs al constructor te puede joder). Yo normalmente hago:

def __init__(self, *args, **kwargs):
author = kwargs.pop('author', None)
super(FormClass, self).__init__(*args, **kwargs)
...

Y en las vistas los llamo asi: f = FormClass(author=author)
O en un post: f = FormClass(request.POST, author=author).

Y asi tambien evito "unexpected arguments" en los constructores de
formularios (el truco del pop) que te pueden dar un dolor de cabeza.

Saludos y suerte.


2013/10/21 Ramiro Floydant <ramirotrvnt18 en gmail.com>

> Buenas tardes!
>
> Estoy terminando el libro Practical Django Projects v2 donde la versión de
> django es menor a 1.2.
>
> Hasta ahora avancé muchísimo y ya estoy por terminarlo. Estoy haciendo
> todo con la versión 1.5 y usando class based views.
>
> La aplicación sirve para compartir snippets de código. Ya hice el
> formulario de registro y ahora tengo que hacer un form para agregar
> snippets:
>
> models.py
>
> class Snippet(models.Model):
>     '''
>
>     Representa un trozo de codigo.
>
>     '''
>
>     titulo              = models.CharField(max_length=255)
>     lenguaje            = models.ForeignKey(Lenguaje)
>     author              = models.ForeignKey(User)
>     descripcion         = models.TextField()
>     descripcion_html    = models.TextField(editable=False)
>     code                = models.TextField()
>     highlighted_code    = models.TextField(editable=False)
>     tags                = TagField()
>     fecha_publicacion   = models.DateTimeField(editable=False)
>     fecha_actualizacion = models.DateTimeField(editable=False)
>
>     objects = managers.SnippetManager()
>
> forms.py
>
> class AddSnippetForm(forms.Form):
>     *def __init__(self, author, *args, **kwargs):
>         super(AddSnippetForm, self).__init__(*args, **kwargs)
> *
> *        self.author = author*
>
>
>     titulo      = forms.CharField(max_length=255)
>     descripcion = forms.CharField(widget=forms.Textarea())
>     code        = forms.CharField(widget=forms.Textarea())
>     tags        = forms.CharField(max_length=255)
>     lenguaje    = forms.ModelChoiceField(queryset=Lenguaje.objects.all())
>
>     def save(self):
>         return Snippet.objects.create(titulo=self.cleaned_data['titulo'],
>
> descripcion=self.cleaned_data['descripcion'],
>                                       code=self.cleaned_data['code'],
>                                       tags=self.cleaned_data['tags'],
>
> lenguaje=self.cleaned_data['lenguaje'])
>
> En teoría lo que hace el __init__ es rellenar el campo author con el
> usuario correspondiente para no mostrarlo en el form y que cualquiera pueda
> elegir un usuario.
>
> Acá empiezan los problemas:
>
> 1) En el libro super aparece así:
> * *super(AddSnippetForm, self).__init__(*args, **kwargs)*:* # nótese los
> dos puntos al final
> Saqué los ":" y me lo tomó
> 2) Cuando hago runserver me sale este error:
>
> __init__() takes at least 2 arguments (1 given)
>
> Si saco el argumento author, no me tira error, pero lo necesito sí o sí.
>
> Será un problema de compatibilidad por las versiones? Hay una nueva forma de hacerlo funcionar?
>
> Desde ya, muchas gracias.
>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20131021/275af29b/attachment.html>


More information about the pyar mailing list