【问题标题】:Django Error: Reverse for 'like_post' with arguments '('',)' not foundDjango 错误:未找到带有参数 '('',)' 的 'like_post' 的反向
【发布时间】:2021-04-13 17:54:00
【问题描述】:

完全错误:未找到带有参数“(”,)”的“like_post”的反向。尝试了 2 种模式:['like/(?P[0-9]+)$', 'home/like/(?P[0-9]+)$']

views.py:

def like_post(request, pk):
    post = Post.objects.get(id=pk)
    liked = False

    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        liked = False
    else:
        post.likes.add(request.user)
        post.dislikes.remove(request.user)
        liked = True

    return HttpResponseRedirect(reverse('home-new'))

如果我将表单操作放在调用视图的 url 上,上面的代码可以工作,但是当我喜欢一个帖子时它会刷新页面,所以我尝试通过 javascript 调用视图,所以我尝试了这个

模板:

{% block content %}

{% for item in products %}
        <div class="item_btns_container">
            <div class="like_btn_form_container">
                <form id="like_form">//was action="{% url 'like_post' item.id %}"
                    {% csrf_token %}
                    {% if user in item.likes.all %}
                        <button type="submit" class="liked_post" name="post_id" value="{{ item.id }}"><div class="liked_btn" >Like</div></button>
                    {% else %}
                        <button type="submit" class="like_btn" name="post_id"  value="{{ item.id }}"><div class="liked_btn">Like</div></button>
                    {% endif %}
                </form>
            </div>
            
{% endfor %}

<script>
    $(document).on('submit','#like_form',function(e){
        e.preventDefault();

        $.ajax({
            type:'POST',
            url:'{% url 'like_post' item.id %}',
              <script>
    $(document).on('submit','#like_form',function(e){
        e.preventDefault();

        $.ajax({
            type:'POST',
            url:'{% url 'like_post' item.id %}',
            data:{
                csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
            },
            success:function(){
                alert("liked");
            }
        });
    });
</script>

            success:function(){

            }
        });
    });
</script>

{% endblock content %}

我也尝试了不同的观点

def like_post(request, pk):
    post = Post.objects.get(id=pk)
    liked = False
    if request.method == 'POST':
        if post.likes.filter(id=request.user.id).exists():
            post.likes.remove(request.user)
            liked = False
        else:
            post.likes.add(request.user)
            post.dislikes.remove(request.user)
            liked = True

    return render(request, 'new.html')

模型.py: 类帖子(模型。模型): likes = models.ManyToManyField(User, related_name='liked_posts', null=True, blank=True)

【问题讨论】:

  • 在模板(JavaScript)中,item定义。
  • 我已编辑将脚本放在下面
  • 但这很重要。 {% url ... %}模板标签使用item.id,但是当时有没有 item.id

标签: django django-views django-templates


【解决方案1】:

在您生成 JavaScript 代码时,item 未定义,因此出现错误。最好在按钮中编码 URL,然后对该 URL 进行 AJAX 调用:

<script>
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }

    const csrftoken = getCookie('csrftoken');

    $(document).on('submit','#like_form',function(e){
        e.preventDefault();
        $.ajax({
            type:'POST',
            url: $(this).attr("url"),
            data : {csrfmiddlewaretoken: csrftoken},
            success:function(){
            }
        });
    });
</script>

{% block content %}

{% for item in products %}

<div class="item_btns_container">
    <div class="like_btn_form_container">
        <form id="like_form">
            {% csrf_token %}
            {% if user in item.likes.all %}
                <button type="submit" class="liked_post" url="{% url 'like_post' item.id %}" name="post_id" value="{{ item.id }}"><div class="liked_btn" >Like</div></button>
            {% else %}
                <button type="submit" class="like_btn" url="{% url 'like_post' item.id %}" name="post_id" value="{{ item.id }}"><div class="liked_btn">Like</div></button>
            {% endif %}
        </form>
    </div>
{% endfor %}

{% endblock content %}

【讨论】:

  • 好的,谢谢,我不再收到反向错误。但是你有没有机会指出我在视图中点赞帖子的错误之处,因为它没有添加点赞
  • @HumzaDin:你能分享一下Post 的模型吗?您能否验证它是否向相应视图发出 POST 请求?
  • @HumzaDin:你确定它通过了跨站点请求伪造检查 (CSRF):docs.djangoproject.com/en/dev/ref/csrf/#ajax
  • 我在函数中添加了一个警报,但没有被调用,所以我现在正在尝试调试
  • @HumzaDin:按钮是否有submit 类型。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 2021-03-29
  • 2019-09-14
  • 2016-11-11
  • 2018-05-02
  • 2017-02-26
  • 2021-03-01
  • 2021-03-13
相关资源
最近更新 更多