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'),
...
]
我正在开发一个关于 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'),
...
]