Django, когда пытался лайкнуть пост, значение меняется, но также выдает ошибку NoReverseMatch в / нечто / нечто / - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над проектом в приложении django, где пользователю может понравиться или не понравиться сообщение.Кнопки «Нравится» и «Не нравится» работают нормально, также значение сохраняется в базе данных.Но когда нажимается кнопка «Мне нравится», она показывает эту ошибку:

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 должен быть обновлен.Версия Джанго 2.1.3

1 Ответ

0 голосов
/ 07 декабря 2018

Ваш путь использует album_id.

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

Поэтому вы должны использовать album_id в своем методе get_absolute_url, если используете kwargs.

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'),
    ...
]
...