我想在Django-forms中设置复选框(BooleanField)的值。值是用户的名称,因此是变量。因此,设置默认值不是一个选项。
Forms.py
class UserForm(forms.Form):
user = forms.BooleanField() // value set should be of the name of user
Template.html
{% for user in users %}
{{user_form.as_table}} {{user.name}}
{%endfor%}
Views.py
users = GrabhaloUser.objects.all()
user_form = UserForm(request.POST or None)
if request.method == 'POST':
if(user_form.is_valid()):
selected_users = user_form.cleaned_data['user']
#get_data(request,selected_users,query) //this is some function. Ignore this.
ctx = {
'users' : users,
'user_form' : user_form
}
return render_to_response('dashboard/dashboard.html',ctx, context_instance = RequestContext(request))
我该如何解决这个问题?
答案 0 :(得分:1)
您应该重新考虑您的方法。表单中user
字段的含义是什么,以及您希望如何选择具有该字段的用户?最有可能ChoiceField更适用。有关此字段的详细信息,请参阅示例this question。
否则,请重命名您的字段以使其更具描述性,例如: selected
。在这种情况下,您必须区分用户,这反过来意味着您必须在表单标识符和名称前加上前缀。换句话说,手动构建表单。作为一个例子(根据您的具体需求调整)
{% for user in users %}
<input id="user_pk_{{ user.pk }}" value="{{ user.pk }}" type="hidden" />
<input id="user_selected_{{ user.pk }}" type="checkbox"{% if user.selected %} checked="checked"{% endif %} />
<input id="user_some_property_{{ user.pk }}" type="text" value="{{ user.some_property }}" />
{% endfor %}
最后,在您的视图中,获取所有条目并处理它们。再一次,例如:
keys = [k for k in user_form.cleaned_data.keys() if k.startswith('user_pk_')]
pks = [pk..rsplit('_', 1)[-1] for pk in keys]
for pk in pks:
user = User.objects.get(pk=pk)
user.selected = user_form.cleaned_data['user_selected_'+pk]
# Et cetera