Quiero hacer una página con una lista de usuarios y casillas de verificación que indiquen si un usuario está seleccionado, lo que aplicará alguna acción a los usuarios seleccionados. he creado una clase de formulario que se parece a esto:Cómo representar el campo de formulario django en la plantilla
#in forms.py
class UserSelectionForm(forms.Form):
"""form for selecting users"""
def __init__(self, userlist, *args, **kwargs):
self.custom_fields = userlist
super(forms.Form, self).__init__(*args, **kwargs)
for f in userlist:
self.fields[str(f.id)] = forms.BooleanField(initial=False)
def get_selected(self):
"""returns selected users"""
return filter(lambda u: self.fields[str(u.id)], self.custom_fields)
En mi plantilla tengo los usuarios listados en una mesa y quiero que la última columna de esta tabla sea aquellas casillas de verificación. Necesito representar campos uno por uno dependiendo de su nombre. He intentado crear una etiqueta de plantilla que devolvería el código HTML del elemento de forma necesaria:
#in templatetags/user_list_tags.py
from django import template
register = template.Library()
#this is django template tag for user selection form
@register.filter
def user_select_field(form, userid):
"""
returns UserSelectionForm field for a user with userid
"""
key = std(userid)
if key not in form.fields.keys():
print 'Key %s not found in dict' % key
return None
return form.fields[key].widget.render(form, key)
Por último, aquí está el código de la plantilla:
<form action="" method="post">
{% csrf_token %}
<table class="listtable">
<tr>
<th>Username</th>
<th>Select</th>
</tr>
{% for u in userlist %}
<tr>
<td>{{u.username}}</td>
<td>{{select_form|user_select_field:u.id}}</td>
</tr>
{% endfor %}
</table>
<p><input type="submit" value="make actions" /></p>
Sin embargo, esto no se une esos widgets a la forma y, por lo tanto, después de enviar el formulario, la validación falla. El mensaje de error dice que todos los campos personalizados son obligatorios. Así que aquí están mis preguntas:
¿Cuál es la manera correcta de hacer que los campos del formulario por separado?
¿Cuál es la forma correcta de crear dicho formulario con casillas de verificación? (Quiero decir tal vez mi método es estúpida y no hay una manera mucho más fácil de lograr lo que quiero.
tal vez deberías intentar hacer esto con un poco de javascript. – unni
No quería usar javascript en mi proyecto en esta etapa. Sin embargo, ¿qué debería hacer exactamente? ¿O qué debería googlear? Sabes que no soy un gran javascript pro =) –