首页 > 解决方案 > Django 返回 NoReverseMatch 而不是使用 Ajax 更新 div

问题描述

描述

我正在为在帖子上发表的评论创建一个赞按钮。

当用户单击like 按钮时,Django 会给出NoReverseMatch并且页面不会自动更新。

刷新页面后,尽管出现NoReverseMatch错误,但它显示数据库中的类似已更新。

我试过什么?

最初,问题在于 csrf_tokens。所以,我添加了 csrf_exempt 装饰器,所以这绝对不是问题。

我玩了很多网址,并尝试将评论ID添加到参数中,但似乎没有帮助。

问题

如何解决 NoReverseMatch 错误并使其使 AJAX 自动将按钮从喜欢更改为不喜欢。

网址.py

path('post/<int:pk>/like-comment', like_comment, name="like_comment")

视图.py

@csrf_exempt
def like_comment(request, pk):
    comment = get_object_or_404(Comment, id=request.POST.get('id'))
    liked = False
    if comment.likes.filter(id=request.user.id).exists():
        comment.likes.remove(request.user)
        liked = False
    else:
        comment.likes.add(request.user)
        liked = True

    context = {
       'comment': comment,
       'is_liked': liked,
       'total_likes': comment.likes.count()
    }

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

main.js

$(document).ready(function(event){
  $(document).on('click', '#like-comment', function(event){
    event.preventDefault();
    var pk1 = $(this).attr('value'); // comment id
    var pk = $(this).attr('data-value'); // post id
    

    $.ajax({
      type: 'POST',
      url: "like-comment",
      data: {'id': pk1, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
      dataType: 'json',


      success: function(response) {
         $('#like-section-comment').html(response['form'])
         console.log($('#like-section-comment').html(response['form']));
      },


      error: function(rs, e) {
         console.log(rs.responseText);
      },

   });
 });
});

comment_section.html

<article class="media content-section">
{% if user.is_authenticated %}
    <form id="like-form-comment" method="post">
        {% csrf_token %}
        {% if request.user in comment.likes.all %}
            <button type="submit" id="like-comment" name="comment_id" data-value="{{ comment.post.id }}" value="{{ comment.id }}" class="btn btn-danger btn-sm">
                Dislike
            </button>
        {% else %}
            <button type="submit" id="like-comment" name="comment_id" data-value="{{ comment.post.id }}" value="{{ comment.id }}" class="btn btn-primary btn-sm">
                Like
            </button>
        {% endif %}
    </form>
{% endif %}

标签: djangoajaxurl

解决方案


你写url: "like-comment",了如何映射到正确的 url?Javascript 对 Django 一无所知。试试这个:
在你的 html 中:

<button type="submit" id="like-comment" name="comment_id" data-value="{{ comment.post.id }}" value="{{ comment.id }}" data-submit-url="{% url 'like_comment' comment.id %}" class="btn btn-primary btn-sm">

现在在你的 JavaScript 中:

url: $(this).attr('data-submit-url'),

推荐阅读