首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoReverseMatch相反的‘保存-post’与参数'('',)‘找不到。尝试1模式:[“保存/(?P<pk>[0-9]+)$”]

NoReverseMatch相反的‘保存-post’与参数'('',)‘找不到。尝试1模式:[“保存/(?P<pk>[0-9]+)$”]
EN

Stack Overflow用户
提问于 2022-03-19 01:39:49
回答 2查看 62关注 0票数 1

我不明白为什么我一直得到这个"NoReverseMatch at /“。我正在尝试将AJAX添加到表单中以保存帖子。这似乎是Javascript中URL的一个问题,但我不知道到底是什么。有人能告诉我这里出了什么问题吗?提前谢谢你。

urls.py

代码语言:javascript
复制
path('', PopularPostListView.as_view(), name='popular'),
path('save/<int:pk>', views.AjaxSave, name='save-post'),

views.py

代码语言:javascript
复制
def AjaxSave(request, pk):
    id = int(request.POST.get('postid'))
    post = get_object_or_404(Post, id=id)
    if request.POST.get('action') == 'post':
        result = post.saves.count()
        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, })  

#This is the view for the popular page
class PopularPostListView(ListView):
    model = Post
    template_name = 'blog/popular.html'
    context_object_name = 'posts'
    ordering = ['-pinned', '-date_posted']
    paginate_by = 25
    queryset = Post.objects.all().filter(approved=True).order_by('-date_posted', '-pinned')

popular.html

代码语言:javascript
复制
{% extends "blog/base.html" %}
{% block content %}
<h1>Popular Posts</h1>
<div style="margin-left: 10%;">
{% for post in posts %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'user-posts' post.author.username %}">{{ post.author }}</a>
<small class="date-text">{{ post.date_posted|date:"F d, Y P" }}</small>
</div>
<h3><a class="article-title" href="{% url 'post-detail' post.id %}">{{ post.title }}</a></h3>
<p class="article-content-listview">{{ post.content|urlize }}</p>
<!--Display image-->
{% if post.image %}
<img style="max-width: 100%; max-height: 100%;" src="{{ post.image.url }}">    
   {% else %}
   {{ NONE }}
   {% endif %}
<!--Display video-->
{% if post.video %}
<video style="max-width: 100%; max-height: 100%;" src="{{ post.video.url }}" controls></video>
{% endif %}
<hr>
<!--Dropdown for post options-->
<div class="post_dropdown_home">
<button class="dropbtn"><i class="fa fa-caret-down fa-2x"></i></button>
<div class="post_dropdown_content">
<div>
<!--Displaying save form-->
<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>
</div>
<div>
<!--Displaying report button--> 
<form action="{% url 'report_post' post.id %}" method="post">
   {% csrf_token %}
   {% if user != post.author %}
      <button class="reportbutton" type="submit" name="post_id" title="Report Post" value="{{ post.id }}" onclick="reportThank();">
<i class="fas fa-exclamation-circle"></i> Report Post
</button> 
   {% endif %}
</form>
</div>
</div>
</div>
<div>
<!--Showing report count to staff-->
   {% if user.is_staff %}
      <small style="margin-left: 0%;">Reports:</small> {{ post.total_reports }}
   {% endif %}
</div>
</article>
{% endfor %}    
</div>

Javascript

代码语言: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>

修正了views.py

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-19 04:50:32

错误是从这一行开始的-- url: "{% url 'save-post' post.id %}",这里您无法访问您的post对象,因为它不在循环中,您可以这样解决您的问题--您没有创建表单,如果您使用ajax请求,请将按钮类型设置为提交,请像这样修改代码

代码语言:javascript
复制
<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调用将如下所示

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2022-03-19 04:16:59

在Ajaxsave函数中,您没有指定pk,您应该将它链接到其中一个对象,然后开始发布,这样视图就不能返回您试图加载的反向查询,使用AJAX请求的最佳实践是使用Django-Rest-Framework,这样它就可以处理所有的请求。

代码语言:javascript
复制
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, })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71534741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档