Не могу обработать вызов ajax на моей странице, потому что Django request.is_ajax возвращает True при начальной загрузке страницы

#javascript #python #jquery #django #ajax

#javascript #python #jquery #django #ajax

Вопрос:

У меня есть страница, которая выполняет вызовы ajax, и мое представление проверяет, является ли вызов ajax с функцией .is_ajax. Однако, когда страница загружается изначально (например, если я останавливаю запуск сервера, а затем перезапускаю его), функция is_ajax, похоже, возвращает True, что вызывает многозначную ошибку / alltext, потому что запрос не содержит ключа «alltext», который содержит данные из моего другого вызова ajax.

Страница представляет собой страницу продукта электронной коммерции, и продукт имеет разные варианты (например, размер и цвет), и когда пользователь выбирает варианты из выпадающего меню (например, Большой, синий), он выполняет 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>
  

Ответ №1:

Все еще не совсем уверен, что было не так, но я это исправил! Сначала страница была настроена так, чтобы она загружала шаблон «homepage.html » сначала, а затем, когда вы нажимаете на продукт, он открывается на той же странице, загружая шаблон «product_info.html «. Поэтому я просто изменил его так, чтобы product_info открывался на новой странице при нажатии на продукт (и добавил новую страницу в urls.py ), и теперь это работает!