progammist
April 29, 2020, 11:30 p.m.

Не могу получить 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$']

Нид хелп

3
The question is asked by the articleDjango - Tutorial 022. Adding a bookmark system (favorites) to the site

Do you like it? Share on social networks!

5
Илья Чичак
  • April 30, 2020, 1:19 a.m.
  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 %}">
    Илья Чичак
    • April 30, 2020, 1:19 a.m.
    • (edited)

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

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

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

      progammist
      • April 30, 2020, 5:38 a.m.
      • (edited)

      Спасибо за отклик,
      попробовал изменить 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
        • April 30, 2020, 12:45 p.m.

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

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

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

          Илья Чичак
          • April 30, 2020, 1:03 p.m.

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

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            • Last comments
            • AK
              April 1, 2025, 11:41 a.m.
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              March 9, 2025, 9:02 p.m.
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              March 9, 2025, 4:14 p.m.
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              Nov. 22, 2024, 9:51 p.m.
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            • Evgenii Legotckoi
              Oct. 31, 2024, 11:37 p.m.
              Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup