NoReverseMatch Реверс для 'save-post' с аргументами '('',)' не найден. Проверен 1 шаблон(ы): ['save/(?P<pk>[0-9]+)$']

Я не могу понять, почему я продолжаю получать это "NoReverseMatch at /". Я пытаюсь добавить AJAX в форму для сохранения постов. Похоже, что это проблема с URL в Javascript, но я не могу понять, в чем именно она заключается. Может ли кто-нибудь подсказать мне, что здесь не так? Заранее спасибо.

urls.py

path('save/<int:pk>', views.AjaxSave, name='save-post'),

views.py

def AjaxSave(request, pk):
    if request.POST.get('action') == 'post':
        id = int(request.POST.get('postid'))
        result = post.saves.count()
        post = get_object_or_404(Post, id=id)
        if post.saves.filter(id=request.user.id).exists():
            post.saves.remove(request.user)
            post.save()
        else:
            post.saves.add(request.user)
            post.save()    

        return JsonResponse({'result': result, })

popular.html Это форма на HTML

<form action="{% url 'save-post' post.id %}" id="save" method="post">
{% csrf_token %}
<button class="savebutton" type="submit" name="post_id" title="Save Post" id="save" value="{{ post.id }}">
<i class="fas fa-bookmark"></i> Save Post
</button>
</form>

Javascript

<script>
  $(document).on('click', '#save', function (e){
    e.preventDefault();
    $.ajax({
      type: 'POST',
      url: "{% url 'save-post' post.id %}",
      data: {
        postid: $('#save').val(),
        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
        action: 'post'
      },
      success: function (json) {
        alert('Post saved!')
      },
      error: function () {
        alert('Error!')
      }
    });
  })
</script>

В функции Ajaxsave вы не указали pk, вы должны связать его с одним из объектов, затем начать делать пост, чтобы представление не могло вернуть обратный запрос, который вы пытаетесь загрузить, лучшая практика использования AJAX запросов - это использование Django-Rest-Framework, чтобы он обрабатывал все запросы.

def AjaxSave(request, pk):
pk = module.objects.get(pk=pk)
if request.method == "POST":
    # or you can get the pk here if you want without parsing to int
    id = int(request.POST.get('postid'))
    result = post.saves.count()
    post = get_object_or_404(Post, id=id)
    if post.saves.filter(id=request.user.id).exists():
        post.saves.remove(request.user)
        post.save()
    else:
        post.saves.add(request.user)
        post.save()    

    return JsonResponse({'result': result, })

Ошибка происходит из этой строки url: "{% url 'save-post' post.id %}", здесь у вас нет доступа к вашему объекту post потому что он не внутри цикла вы можете решить вашу проблему следующим образом вы не должны создавать форму и устанавливать тип вашей кнопки на submit если вы используете ajax запрос измените ваш код следующим образом

<button class="savebutton" type="button" name="post_id" title="Save Post" id="save" onclick="savePost(event)" value="{{ post.id }}" data-url="{% url 'save-post' post.id %}">
    <i class="fas fa-bookmark"></i> Save Post
</button>

и ваш вызов ajax будет выглядеть следующим образом

<script>
function savePost(event){
var url = event.target.getAttribute("data-url");
$.ajax({
    type: 'POST',
    url: url,
    data: {
        postid: event.target.getAttribute('value'),
        csrfmiddlewaretoken: "{{csrf_token}}",
        action: 'post'
    },
    success: function (json) {
        alert('Post saved!')
    },
    error: function () {
        alert('Error!')
    }
 });
}
</script>
Вернуться на верх