Voglio creare una pagina con un elenco di utenti e caselle di controllo che segnalano se un utente è selezionato, che applicherà alcune azioni agli utenti selezionati. Ho creato una classe forma che assomiglia a questo:Come rendere il campo modulo django nel modello
#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)
Nel mio modello ho utenti elencati in una tabella e voglio l'ultima colonna della tabella ad essere quelle caselle di controllo. Devo rendere i campi uno per uno a seconda del loro nome. Ho cercato di creare un tag modello che sarebbe tornato il codice html dell'elemento forma necessaria:
#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)
Infine, ecco il codice del modello:
<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>
Tuttavia, questo non significa leghi questi widget alla forma e quindi, dopo aver inviato il modulo, la convalida fallisce. Il messaggio di errore dice che sono richiesti tutti i campi personalizzati. Così qui sono le mie domande:
Qual è il modo giusto per rendere i campi del modulo separate?
Qual è il modo corretto di creare un modulo con le caselle di controllo? (Voglio dire, forse il mio metodo è stupido e c'è un modo molto più semplice di ottenere ciò che voglio.
forse dovresti provare a farlo con un piccolo javascript. – unni
Non volevo usare javascript nel mio progetto su questo palco. Tuttavia, cosa dovrei fare esattamente? O cosa dovrei google? Sai che non sono un enorme javascript pro =) –