[pyar] Renderizar 2 radio button con input text en form de django

Martin Alderete malderete en gmail.com
Vie Ago 5 12:44:47 ART 2016


Buenas!
Como va?

2016-08-04 15:00 GMT-03:00 Emiliano Dalla Verde Marcozzi <
edvm en fedoraproject.org>:

> ¿Pudieron hacer el débito en mi cuenta?El 4 de agosto de 2016, 14:54,
> Juan Cruz Piñero <jpinero en fi.uncoma.edu.ar> escribió:
>
>> En si parece que necesitas redefinir widgets por defecto, igual me parece
>> que te quedaria un diseño mas claro con los dos widgets juntos y que los
>> inputs se habiliten/deshabiliten o se muestren/oculten dependiendo del
>> valor seleccionado.
>>
>> Para esto particularmente me parece que al ser comportamiento dinámico,
>> te va a quedar mejor con javascript/jquery.
>>
>> 1. En el form de django podes pisar la inicialización del form para
>> asignarle a los widgets de ambos campos el atributo 'hidden'.
>> https://docs.djangoproject.com/es/1.9/ref/forms/widgets/#widget
>>
>> 2. Cada vez que te cambia el grupo de los radio atrapas el valor nuevo
>> del selector y haces el show del campo correspondiente, y ocultas el otro.
>>
>> El 3 de agosto de 2016, 23:11, Emiliano Dalla Verde Marcozzi <
>> edvm en fedoraproject.org> escribió:
>>
>>> Buenas Lista!
>>> Les consulto, en un form de django, como puedo lograr hacer lo
>>> siguiente?:
>>> https://edvm.chiba.ga/issue.png
>>> Price y Discount tienen que ser <input type="text">, para permitirle al
>>> usuario ingresar valores.
>>> Y los radio buttons son para que el usuario elija si quiere definir un
>>> precio, o quiere definir un descuento (se excluyen mutuamente).
>>> Desde ya, muchas gracias!
>>>
>>> Juan Cruz, muchas gracias por tu respuesta!
> Ayer termine haciendo algo parecido a lo que comentar. Primero, defini un
> Widget como sigue:
>
> class KadusiaPriceInput(NumberInput):
>
>     def render(self, name, value, attrs=None):
>         html = super(KadusiaPriceInput, self).render(name, value, attrs)
>         radiobtn = '<input type="checkbox" name="{}"><br />'.format('is_'
> + name)
>         return radiobtn + html
>

@Emi, eso esta bien, aunque lo "correcto" es usar html escape de Django
para evitar cualquier tipo de issue.
En tu ejemplo cambiaria la linea:
        radiobtn = '<input type="checkbox" name="{}"><br />'.format('is_' +
name)
por
        radiobtn =  format_html('<input{0} />', flatatt({'type':
'checkbox', 'name': 'is_{}'.format(name)})) + '<br />'

necesitasn dos imports

from django.utils.html import  format_html
from django.forms.utils import flatatt



>
> De esta forma agrego el checkbox (antes era radiobutton) a cada field,
> 'price' y 'discount'.
> Luego en el template meti un poco de javascript para manejar los eventos
> de cuando se cliquea
> un checkbox o el otro:
>     <script>
>         var price_s = $('input[name=price]');
>         var ch_price_s = $('input[name=is_price]');
>         var discount_s = $('input[name=discount]');
>         var ch_discount_s = $('input[name=is_discount]');
>         ch_price_s.on('click', function(e){
>           ch_discount_s.prop('checked', false);
>           discount_s.val("");
>           price_s.focus();
>         });
>         ch_discount_s.on('click', function(e){
>           ch_price_s.prop('checked', false);
>           price_s.val("");
>           discount_s.focus();
>         });
>     </script>
>

Este JS te conviene meterlo en un file.js, los Widgets de Django tiene una
inner class Media[0] (los forms tambien la tienen) donde podes definir CSS
y JS que queres usar. OJO! que al hacer esto tenes que cambiar un poco la
cosa... porque no tenes el contexto del widget (name, type, etc). Lo que se
suele hacerse es ponerle una clase especial al widget (class="emi_widget")
o poner un <div> con una clase especial que adentro tiene tu widget etc....
y con JS luego buscas esos elementos $(".emi_widget") y trabajas como
siempre, de esa forma te queda "generico"

Otra forma  seria que el Widget.render() devuelva junto con el widget HTML
el string JS (bien sanitizado)como el que pusiste vos en tu ejemplo (ese si
tiene el contexto del widget).


Una forma que nunca use y acabo de conocer es usar MultiWidget, un widget
especial de Django que parece servir para estos casos en donde tu Widet e
suna composicion de otros widgets entonces podes aprovechar las clases de
Django para eso.

[0] https://docs.djangoproject.com/ja/1.9/topics/forms/media/
[1] https://docs.djangoproject.com/en/1.9/ref/forms/widgets/#multiwidget


>
> No tengo idea si sera la forma correcta de hacerlo (por eso mande el
> mail), pero bueno, quedo
> andando.
> Saludos y muchas gracias!
>
>
Bueno espeor que sirva y cualquier cosa chifla :)!

Saludos!


-- 
Martin Alderete
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160805/6fd2d8d8/attachment-0001.html>


Más información sobre la lista de distribución pyar