[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