progammist
29 апреля 2020 г. 23:30

Не могу получить ID статьи/поста

django

Вопрос такой, пытаюсь сделать "Добавить статью в избранное" без ajax. В чем проблема, не могу получить ID статьи . Вот что имеем:

models.py

  1. class Post(models.Model): #модель статьи
  2.  
  3. title = models.CharField(max_length=200, unique=True, verbose_name=u'Заголовок поста', db_index=True )
  4. slug = models.SlugField(max_length=200, unique=True)
  5. favourite = models.ManyToManyField(User, related_name='favourtie', blank=True)
  6.  
  7. def __str__(self):
  8. return self.title

views.py

  1. def post_detail (request, slug): #вьюха вывода статьи
  2.  
  3. template_name = 'post_detail.html'
  4. post = get_object_or_404(Post, slug=slug)
  5.  
  6. is_favourite = False # переменная для добавления статьи в избранное
  7. if post.favourite.filter (id=request.user.id).exists():
  8. is_favourite = True
  9.  
  10. return render(request, template_name, {'post': post, 'is_favourite': is_favourite,})
  11.  
  12. #Функция добавления статьи в избранное
  13.  
  14. def favourite_post(request, id):
  15. post = get_object_or_404(Post, id=id)
  16. if post.favourite.filter(id=request.user.id).exists():
  17. post.favourite.remove(request.user)
  18. else:
  19. post.favourite.add(request.user)
  20. return HttpResponseRedirect(post.get_absolute_url())
  21.  

urls.py

  1. urlpatterns = [
  2.  
  3. path('<slug:slug>/', views.post_detail, name='post_detail') #вывод статьи,
  4. path ('favourite_post', views.favourite_post, name="favourite_post") #Добавление в избранное,
  5.  
  6. ]

В шаблоне вывожу ссылку на статью:

  1. <h2><a href="{% url 'post_detail' post.slug %}">{{ post.title }}</a></h2>

Как только пыатюсь добавить кнопку в шаблон-статью "Добавить в избранное":

  1. {% if is_favourite %}
  2. <a href="{% url 'favourite_post' id=post.id %}">
  3. <i class="fas fa-heart"></i>
  4. </a>
  5.  
  6. {% else %}
  7.  
  8. <a href="{% url 'favourite_post' id=post.id %}">
  9. <i class="far fa-heart"></i>
  10.  
  11. </a>
  12.  
  13. {% endif %}
  14.  

Получаю ошибку при переходе по урл статьи:

NoReverseMatch at /novayastatya/
Reverse for 'favourite_post' with keyword arguments '{'id': 57}' not found. 1 pattern(s) tried: ['favourite_post$']

Нид хелп

Вам это нравится? Поделитесь в социальных сетях!

5
Илья Чичак
  • 30 апреля 2020 г. 1:19
  1. path('favourite_post', views.favourite_post, name="favourite_post") #Добавление в избранное,
  2.  
  3.  
  4. path('favourite_post/<post_id:int>/', views.favourite_post, name="favourite_post") # Должно быть так
  5.  

У вас нет идентификатора ID в URL - следовательно он не знает, куда подставлять id в шаблоне

  1. <a href="{% url 'favourite_post' id=post.id %}">
    Илья Чичак
    • 30 апреля 2020 г. 1:19
    • (ред.)

    ну и лично я считаю, что правильнее было бы хранить в юзере связь с постами - как-то логичнее
    можно было бы сделать так:

    1. if user.favourites.filter(id=id).exists():
    2. user.favourites.remove(post)
    3. else:
    4. user.favourites.add(post)

    Читается так:
    Пользователь добавляет пост в избранное, а не Пост в избранное добавляет пользователя

      progammist
      • 30 апреля 2020 г. 5:38
      • (ред.)

      Спасибо за отклик,
      попробовал изменить url, получил ошибку:

      1. "URL route '%s' uses invalid converter %s." % (original_route, e)
      2. django.core.exceptions.ImproperlyConfigured: URL route 'favourite_post/<post_id:
      3. int>/' uses invalid converter 'post_id'.
      4.  

      Если изменить слово path , на url в начале:

      1. url('favourite_post/<post_id:int>/', views.favourite_post, name="favourite_post")

      То ошибка вроде пропадает, но при клике на статью:

      1. Reverse for 'favourite_post' with keyword arguments '{'id': 57}' not found. 1 pattern(s) tried: ['favourite_post/<post_id:int>/']

      Может быть надо как-то изменить ссылку на статью?
      Статьи вывожу так:

      1. <h2><a href="{% url 'post_detail' post.slug %}">{{ post.title }}</a></h2>

      Урл получается localhost/novayastatya

        Evgenii Legotckoi
        • 30 апреля 2020 г. 12:45

        вообще так должен записываться url для path

        1. path('favourite_post/<int:post_id>/', views.favourite_post, name="favourite_post")

        сначала тип, а потом его имя

          Илья Чичак
          • 30 апреля 2020 г. 13:03

          точно. а я писал по памяти с телефона:(

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              22 ноября 2024 г. 21:51
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…