【问题标题】:Can't process ajax call on my page because Django request.is_ajax returns True when page is intially loaded无法在我的页面上处理 ajax 调用,因为 Django request.is_ajax 在页面初始加载时返回 True
【发布时间】:2021-02-26 06:00:15
【问题描述】:

我有一个进行 ajax 调用的页面,我的视图使用 .is_ajax 函数检查调用是否为 ajax。但是,当页面最初加载时(例如,如果我停止运行服务器然后重新启动它)is_ajax 函数似乎返回 True,这会在 /alltext 处导致 MultiValueDictKeyError,因为请求不包含键“alltext”,其中包含来自我的其他 ajax 调用的数据。

该页面是一个电子商务产品页面,产品有不同的变体(即尺寸和颜色),当用户从下拉菜单中选择变体(即大号、蓝色)时,它会对后端从数据库中检索此特定变体的价格。

这是我的代码:

views.py

def product_info(request):
if request.method == "GET" and not request.is_ajax: # this is supposed to be loaded on page load
    return render(request, "product_info.html")

elif request.is_ajax and request.method == "GET":

    print(request.is_ajax)

    '''When a user chooses a product variant on the page, this makes an ajax call
    to retrieve the price of this combination'''

    print("request was ajax")

    combinations = request.GET["alltext"]
    combinations_list = combinations.split(";")
    product = Product.objects.all().latest("id")

    var_names = Variation.objects.filter(product=product)

    corresponding_values = []
    for i in range(len(combinations_list)):
        # finding this variant in database

        var_name = var_names[i]
        var_values = VariationValue.objects.filter(variation_name=var_name)
        for val_obj in var_values:
            val = val_obj.value
            if val == combinations_list[i]:
                corresponding_values.append(val_obj)

    found_price = None
    for i in range(len(corresponding_values)):
        val = corresponding_values[i]
        if i == 0:
            combo_query = VariationCombination.objects.filter(variation_value=val)
        else:
            combo_query = combo_query.filter(variation_value=val)

    price = combo_query[0].price

    return HttpResponse("You chose: " + combinations + "price: " + price)

这是 product_info 页面的相关部分 - 用户选择变体的表单和将变体发送到后端的脚本:

product_info.html

    <form class="variations-form">
 {% for name in variation_names %}
    <div class="form-group">
        <label class="btn-label">{{ name.variation_name }}:</label>
      <!--<button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown">
         <span class="selection"></span><span class="caret"></span>
      </button>-->

      <select name="variation{{ forloop.counter }}" class="form-control variations" id="variation{{ forloop.counter }}">
        <option value="" selected disabled>{{ name.variation_name }}</option>
      {% for key, value_list in variation_values.items %}
        {% if key == name.variation_name %}
         {% for value in value_list %}

          <option value="{{ value }}">{{ value }}</option>

          {% endfor %}
            {% endif %}
        {% endfor %}
      </select>


    </div>
    <br>
    {% endfor %}
 </form>

带有 ajax 调用的脚本标记

<script>

    $(document).ready(function () {

  $('.form-control').change(function(){
    if ($('#variation1').val()) {
      var valueFrom = $('.variations option:selected').map(function () {
        return $(this).val();
    }).get();

    var alltext = valueFrom.join(";")

        $('#chosen-options').html(alltext).show('fast');


          $.ajax(
    {
        type:"GET",
        data:{
                 'action':'options_chosen',
                 alltext: alltext
        },
        success: function( data )
        {
            $('#chosen-options').html(data).show('fast');
        }
     });
    };
  });

});

</script>

【问题讨论】:

    标签: javascript python jquery django ajax


    【解决方案1】:

    仍然不完全确定出了什么问题,但我已修复它!起初,页面被设置为首先加载模板“homepage.html”,然后当您单击产品时,它会通过加载模板“product_info.html”在同一页面中打开。所以我只是更改了它,以便当您单击产品时 product_info 在新页面上打开(并将新页面添加到 urls.py),现在它可以工作了!

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多