#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 ), и теперь это работает!