Django没有将数据传递给POST请求的视图

时间:2018-03-12 21:03:05

标签: python jquery html css django

我创建了一个下拉菜单,该菜单应该将数据传递给视图,以帮助过滤查询集。但是,看起来数据实际上并未传递给视图。以下是我写的相关代码。

template.html

<!-- Query based content for dropdown menu -->
<form method="POST" action="{% url 'property-selected' %}" id="property-select">
    {% csrf_token %}
    <select class="dropdown-content" onchange="this.form.submit()" name="property-select">
        {% if current_user_meters %}
            <option disabled selected> -- select an option -- </option>
            {% for meter in current_user_meters %}
                <option class="dropdown-menu-option" value="{{meter.id}}">{{meter.name}}</option>
            {% endfor %}
        {% else %}
            <option>You don't have any meters</option>
        {% endif %}
    </select>
</form>

views.py

def property_selected(request):
    if request.method == 'POST':

        selection = request.POST.get('property-select')

        current_user_groups = Group.objects.filter(
            id__in=request.user.groups.all()
        )
        current_user_properties = Property.objects.filter(
            groups__in=current_user_groups
        )
        current_user_meters = Meter.objects.filter(
            meter_id__in=current_user_properties
        )

        selected_meters = Meter.objects.filter(name=selection)
        selected_meter_data = MeterData.objects.filter(
            name=selection
        ).order_by('date')

        return render(request, 'properties/property-selected.html', {
            'current_user_meters': current_user_meters,
            'selection': selection,
            'selectected_meters': selected_meters,
            'selected_meter_data': selected_meter_data,
        })

对于views文件中的查询集,selection变量似乎没有得到任何东西,这就是我想要POST请求中的数据的地方。我希望POST请求中的数据能够到达那里,以便我的selected_metersselected_meter_data查询按预期工作。

2 个答案:

答案 0 :(得分:2)

属性选择选项中的值是ID,但您尝试按名称使用这些值过滤MeterData。可以按id过滤,也可以使用name属性作为选项值。

答案 1 :(得分:0)

您需要使用表单来提取数据(从而提供清理和验证)或访问request.body而不是request.post,然后自己解析。

从文档中强调我的(https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.POST):

  

HttpRequest.POST¶包含所有给定HTTP的类字典对象   POST参数,提供请求包含表单数据。看到   下面的QueryDict文档。 如果您需要访问raw或   请求中发布的非表单数据,通过该访问权限   相反,HttpRequest.body属性

     

请求可以通过POST以空POST进入   字典 - 例如,如果通过POST HTTP方法请求表单但是   不包括表单数据。因此,你不应该使用if   request.POST检查POST方法的使用;相反,使用if   request.method ==“POST”(参见HttpRequest.method)。

我建议将请求传递到表单中。它为您提供了一些很好的功能,并且允许您自己解析request.body,即使这是一个额外的步骤。