Кнопка Ajax запускает каждую кнопку, а не только выбранную

-2

Я хотел бы создать кнопку ajax, которая когда-то была нажата, элемент становится "приобретенным" пользователем. После приобретения предмета текст кнопки будет обновлен.

Функция работает, однако, как будто я щелкнул каждую кнопку, а не одну.

Например, у меня есть два предмета для покупки. Если я нажму "купить" по пункту 1, оба пункта 1 и пункт 2 пройдут так, как если бы они были куплены. Как сделать так, чтобы был куплен только пункт 1?

Заранее спасибо!

views.py:

def product_purchase(request):
    if request.is_ajax() and request.POST:
        user = request.user
        product_pk = request.POST.get('product_pk', False)
        product = get_object_or_404(Product, pk=product_pk)

        purchased, created = Product.objects.get_or_create(pk=product_pk)

        try:
            user_purchased = Product.objects.get(pk=product_pk, buyers=user)
        except:
            user_purchased = None

        if user_purchased:
            purchased.buyers.remove(user)
            purchased.save()
            user_has_purchased = False
        else:
            purchased.buyers.add(user)
            purchased.save()
            user_has_purchased = True

        data = {
            "user_has_purchased": user_has_purchased,
        }
        new_data = json.dumps(data)
        return HttpResponse(new_data, content_type='application/json')
    else:
        raise Http404

HTML:

{% for product in products %}
    <input class="btn btn-default selector" product="{{ product.pk }}" value="{% if request.user.username in purchased.get_buyers %} Purchased {% else %} {{ product.cost }} points {% endif %}" type="button" />
{% endfor %}

JavaScript:

$('.selector').click(function(e){
    e.preventDefault();
    var $selector = $(e.currentTarget);
    $.ajax({
        type: "POST",
        url: "{% url 'product_purchase' %}",
        data: {
            "product_pk": $(this).attr("product"),
            csrfmiddlewaretoken: "{{ csrf_token }}",
        },
        dataType: "json",
        success: function(data) {
            if (data.user_has_purchased) {
                $selector.val("Purchased");
            } else {
                $selector.val("{{ product.cost }} points");
                }
        },
        error: function (rs, e) {
            alert('Sorry, there was an error.');
        }
    });
});
  • 0
    Почему вы используете get_object_or_404 а затем get_or_create ?
  • 0
    попробуйте вместо этого e.target
Показать ещё 6 комментариев
Теги:
django-views

1 ответ

0
Лучший ответ

Приношу свои извинения всем. Решение было значением, которое я передал на своем входе. Корректировка заключалась в изменении purchased.get_buyers на product.get_buyers.

Спасибо всем за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню