在Django模板中,我显示了一些用户名(或unames
)以及如下所示的复选框:
<form method="POST" action="{% url 'process_unames' %}">
{% csrf_token %}
{% for name in unames %}
<input type="checkbox" name="target{{ forloop.counter0 }}" value="{{ unames|index:forloop.counter0 }}" checked>{{ name }}<br>
{% endfor %}
<button name="duration" value="{{ value }}" type="submit">Submit</button>
</form>
然后在函数process_unames
中,我尝试通过以下方式检索所有已检查取消名称:
def process_unames(request, *args, **kwargs):
uname_list = request.POST.getlist('unames')
这始终会产生一个空列表,无论我检查或取消选中哪个uname。我该如何解决?一个说明性的例子会很棒。
如果重要,我还没有使用这个Django模板在forms.py
中声明任何形式。此外,请注意index
是一个自定义模板标记,可以执行以下操作(我可以保证它正常工作):
from django.template.defaulttags import register
@register.filter(name='index')
def index(List, i):
return List[int(i)]
答案 0 :(得分:2)
您正在检查错误的变量。您可以通过名称访问输入。
因此,对于单个值,您将检索此类
的表单的数据<input type="checkbox" name="user_name" value={{uname}}>
经由
request.POST.get('user_name')
请参阅:https://docs.djangoproject.com/en/1.10/topics/forms/#the-work-that-needs-to-be-done
如果你有循环,你仍然给每个相关的输入命名相同,并使用request.POST.getlist()
作为列表访问这些值。
答案 1 :(得分:1)
模板中没有任何名为“unames”的字段。你有一堆不相关的复选框叫做“targetX”,其中X是一个数字。只用name="unames"
替换它,你的代码就可以了。
注意两件事:首先,你应该使用Django的表单框架;其次,你的过滤器是没有意义的,因为{{ name }}
已经是unames
中的值,因为那是你正在迭代的(事实上,你已经将它用作标签)。 p>
{% for name in unames %}
<input type="checkbox" name="unames" value="{{ name }}" checked>{{ name }}<br>
{% endfor %}