Нет обратного матча Jquery Ajax Вызов Django - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над кнопкой «Мне нравится» с javascript и ajax и получаю сообщение об ошибке без обратного соответствия при вызове через ajax, но без вызова ajax все работает нормально. Другое дело, это хорошо работает на странице сведений, но не на главной странице, и именно здесь появляется эта ошибка.

Это ошибка:

Reverse for 'like_post' with no arguments not found. 1 pattern(s) tried: ['posts/(?P<slug>[^/]+)/like/$']

js

    $(document).ready(function(event){
    $(document).on('click', '#like', function(event){
        event.preventDefault();
        var pk = $(this).attr('value');
        $.ajax({
            type: 'POST',
            url: '{% url "posts:like_post" %}',
            data: {'slug': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
            datatype: 'json',
            success: function(response){
                $('#like-snip').html(response['form'])
                console.log($('#like-snip').html(response['form']));
            },
            error: function(rs, e){
                console.log(rs.responseText);
            },

        });
    });
});

views.py

 @login_required
def like_post(request, slug):
    user = request.user
    post = get_object_or_404(Post, slug=slug)
    # post = get_object_or_404(Post, id=request.POST.get('id'))
    # url_ = post.get_absolute_url()
    is_liked = False
    if user in post.likes.all():
        post.likes.remove(request.user)
        is_liked = False
    else:
        post.likes.add(request.user)
        is_liked = True
    context = {
        'post':post,
        'is_liked':is_liked,
        'total_likes':post.total_likes()
    }

    if request.is_ajax():
        html = render_to_string('posts/like_snippet.html', context, request=request)
        return JsonResponse({'form': html})

urls

    path('<slug>/like/', views.like_post, name='like_post'),

like_snippet. html

<form action="{% url 'posts:like_post' post.slug %}" method="post">{% csrf_token %}
    {% if is_liked %}
        <button type="submit" id="like" name="post_slug" value="{{ post.slug }}" class="btn-sm btn-outline-danger">{{ post.likes.count}} Unlike{{ post.likes.count|pluralize }}</button>
    {% else %}
        <button type="submit" id="like" name="post_slug" value="{{ post.slug }}" class="btn-sm btn-outline-info">{{ post.likes.count}} Like{{ post.likes.count|pluralize }}</button>
    {% endif %}
</form>

и здесь находится аналогичный раздел в myhome. html и подробностях. html

                <div id="like-snip">
                    {% include 'posts/like_snippet.html' %}

                </div>

Заранее спасибо, ребята!

1 Ответ

0 голосов
/ 30 апреля 2020

В вашем JS у вас есть url: '{% url "posts:like_post" %}', где вы не предоставляете обязательный параметр "slug" и вместо этого предоставляете его в данных запроса POST. Django запускает поиск URL-адреса перед отправкой страницы клиенту, где происходит ошибка из-за пропущенного значения.

Изменение

value="{{ post.slug }}"

в вашем файле like_snippet. html на

value="{% url "posts:like_post" post.slug %}"

, что позволит вам изменить параметры

            url: '{% url "posts:like_post" %}',
            data: {'slug': pk, 'csrfmiddlewaretoken': '{{ csrf_token }}'},

в запросе AJAX на

            url: pk,
            data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...