从Django模板中的复选框数组中检索数据

时间:2017-02-28 07:15:16

标签: django django-templates

在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)]

2 个答案:

答案 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()作为列表访问这些值。

请参阅:https://stackoverflow.com/a/23470119/630877

答案 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 %}