Django 尝试点赞 post 时,值正在改变,但也在 /something/something/ 处给出错误 NoReverseMatch

Django when tried to Like a post, value is changing but also gives error NoReverseMatch at /something/something/

我正在开发一个关于 django 应用程序的项目,用户可以在其中喜欢或不喜欢 post。喜欢和不喜欢按钮工作正常,值也保存在数据库中。但是当单击按钮 "Like" 时,它会显示此错误:

NoReverseMatch at /gallery/likes/ Reverse for 'detail' with keyword arguments '{'pk': 9}' not found. 1 pattern(s) tried:
['gallery\/(?P<album_id>[^/]+)$']

但我不想出现这个错误。

model.py

class Album(models.Model):    
    caption = models.TextField()
    photo = models.FileField() 
   uploader=models.ForeignKey(User,on_delete=models.CASCADE,default=None)
    likes = models.ManyToManyField(User, related_name='likes',blank=True)

def __str__(self):
    return self.caption  

def get_absolute_url(self):
    return reverse('gallery:detail', kwargs={"pk": self.pk})

url.py

app_name = 'gallery'

urlpatterns = [
  path('', views.IndexView.as_view(), name='index'),
  path('<album_id>',views.detail, name='detail'),
  path('likes/',views.like_post, name='like_post'),
  path('album<pk>/delete',views.AlbumDelete.as_view(), name='album-delete'),
 ]

views.py

def detail(request,album_id):
    album = get_object_or_404(Album, pk=album_id)
    is_liked = False
    if album.likes.filter(id=request.user.id).exists():
          is_liked = True
    context = {
            'album' : album,
            'is_liked' : is_liked,
    }
    return render(request, 'gallery/detail.html', context)


 def like_post(request):
    album = get_object_or_404(Album, id=request.POST.get('album_id'))
    is_liked = False
   if album.likes.filter(id=request.user.id).exists():
        album.likes.remove(request.user)
        is_liked = False
   else:
       album.likes.add(request.user)
       is_liked = True
   return HttpResponseRedirect(album.get_absolute_url())

detail.html

{% extends 'gallery/base.html' %}
 <title>{% block title%}User Photos{% endblock %}</title>
{% block body%}  
 <div class="center">
    <img src="{{ album.photo.url }}" height="442" width="512">
     <h3>{{ album.caption }}</h3>

  {% if request.user == album.uploader %}
    <form action="{% url 'gallery:album-delete' album.id %}" method="post" >
              {% csrf_token %}
        <input type="hidden" name="album_id" value="{{ album.id }}" />
        <button type="submit" class="deleteB">delete
             <span class="glyphicon glyphicon-trash"></span>
        </button>            
    </form>
   {% endif %}

  <!--like option adding-->
    <form action="{% url 'gallery:like_post' %}" method="post" >
          {% csrf_token %}
          {% if is_liked %}
        <button type="submit" name="album_id" value="{{album.id}}" class="btn btn-danger">DisLike</button>   
         {% else %} 
            <button type="submit" name="album_id" value="{{album.id}}" class="btn btn-primary">Like</button> 
          {% endif %}        
    </form>

  </div>


{% endblock %}

我是 django 的新手,所以我无法理解这里的主要错误是什么。我认为 url.py 应该更新。 django 的版本是 2.1.3

您的路径使用 album_id

path('<album_id>',views.detail, name='detail'),

因此,如果您使用 kwargs.

,则必须在 get_absolute_url 方法中使用 album_id
def get_absolute_url(self):
    return reverse('gallery:detail', kwargs={"album_id": self.pk})

您的 URL 模式有点脆弱。目前,'likes/' 几乎与 '<album_id>' 匹配,这将导致请求由 URL 处理。将 'likes/' 移动到详细模式上方会更安全,这样它会首先匹配。 由于 album_id 是一个整数,您可以使用 <int:album_id> 以便它只匹配数字。如果您在 likes/ 中使用尾部斜杠,我会将其添加到 detail 路径中以保持一致。

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('likes/',views.like_post, name='like_post'),
    path('<int:album_id>/',views.detail, name='detail'),
    ...
]