【问题标题】:Django not passing data to views on POST requestDjango没有将数据传递给POST请求的视图
【发布时间】:2018-08-21 00:18:25
【问题描述】:

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

模板.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,
        })

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

【问题讨论】:

    标签: python jquery html css django


    【解决方案1】:

    您需要使用表单来获取数据(从而提供清理和验证)或访问 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,即使这是一个额外的步骤。

    【讨论】:

    • 这一切似乎都无关紧要。 OP 想在哪里访问非表单数据?他们只想要来自“property-select”元素的数据,该元素在 POST 数据中提交。这里根本不需要自己“解析 request.body”。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的提示!但是,这无助于解决选择变量似乎没有发布的原因。问题发生在任何过滤/查询发生之前。我知道这一点是因为如果在页面加载时存在选择变量并且模板没有正确响应,我让测试模板有响应。
    • 我不确定我是否理解。当页面第一次加载时,它不是 POST,那么该值应该来自哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2020-01-25
    • 2017-09-02
    • 1970-01-01
    • 2012-05-17
    • 2012-03-12
    相关资源
    最近更新 更多