Джанго Аякс любит работать некорректно: проблема с jQuery - PullRequest
0 голосов
/ 02 июня 2019

У меня есть функция Like , которая отлично работает для "Подробный продукт" .Тем не менее, я хочу добавить эту функцию на главной странице, где отображаются несколько продуктов.Не уверен, как правильно это сделать.

urls.py :

url(r'^like$', views.like_product, name='like_product')

скрипт в base.html :

<script type="text/javascript">
    $(document).ready(function(event){
        $(document).on('click', '#like', function(event){
            event.preventDefault();
            var pk = $(this).attr('value');
            $.ajax({
                type: 'POST',
                url: '{% url 'like_product' %}',
                data: {'id': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
                dataType: 'json',
                success: function(response){
                    $('#like-section').html(response['form'])
                    console.log($('#like-section').html(response['form']));
                },
                error: function(rs, e){
                    console.log(rs.responseText);
                },
            });
        });
    });
</script>

likes.html :

<form action="{% url 'like_product' %}" method="post">
    {% csrf_token %}
    {% if is_liked %}
        <button type="submit" id="like" name="product_id" value="{{ product.id }}" class="btn btn-danger">Dislike</button>
    {% else %}
        <button type="submit" id="like" name="product_id" value="{{ product.id }}" class="btn btn-primary">Like</button>
    {% endif %}
</form>

views.py :

def home(request):
    products = Product.objects.all().order_by('-pub_date')
    f = ProductFilter(request.GET, queryset=products)
    context = {
        'filter': f,
    }
    return render(request, 'product/home.html', context).


def detail(request, product_id):
    product = get_object_or_404(Product, product_id=product_id)
    is_liked = False
    if product.likes.filter(id=request.user.id).exists():
        is_liked = True
    context = {
        'product': product,
        'is_liked': is_liked,
        'total_likes': product.total_likes()
    }
    return render(request, 'product/detail.html', context)


def like_product(request):
    product = get_object_or_404(Product, id=request.POST.get('id'))
    is_liked = False
    if product.likes.filter(id=request.user.id).exists():
        product.likes.remove(request.user)
        is_liked = False
    else:
        product.likes.add(request.user)
        is_liked = True
    context = {
        'product': product,
        'is_liked': is_liked,
        'total_likes': product.total_likes()
    }
    if request.is_ajax():
        html = render_to_string('product/likes.html', context, request=request)
        return JsonResponse({'form': html})

Нравится / не нравится записываются правильно, если нажать на главной странице, однакоони отображаются неправильно (фактическое количество лайков и кнопка «Мне не нравится» можно увидеть только на странице «Подробный продукт»).Я подозреваю, что это потому, что у меня есть id="like" в likes.html для обеих кнопок.Я подозреваю, что скрипт jQuery также необходимо изменить.Не уверен, как это сделать.Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 02 июня 2019

Я предполагаю, что вы получаете идентификатор от URL до страницы с подробностями.Это действительно зависит от того, как вы генерируете список продуктов на странице, но если вы используете цикл в шаблонах, просто добавьте кнопку «Мне нравится» под каждым продуктом, а затем используйте его идентификатор для настройки формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...