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>