Создаю функцию для сайта - "Лучший пост" или что то вроде того. Суть в том что при переходе по ссылке, пользователя должно направить на статью с самым большим кол-вом лайков.
Мой views:
def best_post(request, pk):
best_post = Post.objects.annotate(num_likes=Post.total_likes()).filter(num_likes__gt=70).order_by('-created_date')
b_post = get_object_or_404(best_post, pk=pk)
total_likes = b_post.total_likes()
latest_comments_list = Comment.objects.filter(post=pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.author = request.user
form.post = b_post
form.save()
else:
form = CommentForm()
return render(request, 'blog/post_detail.html', {'best_post': best_post, 'b_post': b_post, 'latest_comments_list': latest_comments_list, 'total_likes': total_likes,
'form': form})
Мой urls:
urlpatterns = [
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('post/<int:pk>/', views.best_post, name='best_post')
]
мой base.html:
...
{% block bg %}
<body class="start-pages">
{% endblock %}
<div class="page-header">
{% if user.is_authenticated %}
{% else %}
<a href="{% url 'register' %}" class="top-menu btn btn-outline-primary">Регистрация</a> <a href="{% url 'login' %}?next={% url 'main_menu' %}" class="top-menu btn btn-outline-primary">Войти</a>
{% endif %}
<a href="{% url 'main_menu' %}" class="btn btn-light underhead">Главная</a>
<a href="{% url 'post_new' %}" class="btn btn-light underhead">Добавить пост</a>
<a href="{% url 'best_post' pk=b_post.pk %}" class="btn btn-light underhead"><span class="star">★ </span>Лучший пост</a>
{% if user.is_authenticated %}
<a href="{% url 'logout' %}" class="btn btn-light underhead">Выход</a>
{% endif %}
</div>
...
models.py:
class Post(models.Model):
GAME_CHOICES = (
(1, 'WOT'),
(2, 'Pubg'),
)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
textinfo = models.CharField(max_length=250, default='О чем ваш текст?')
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_post')
game = models.PositiveSmallIntegerField(choices=GAME_CHOICES, default=1)
tags = TaggableManager()
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return '{}/{}/{}'.format(self.title, self.game, self.tags)
def total_likes(self):
return self.likes.count()
Как я понимаю - Там где я расположил кнопку "Лучшего поста" , Нету переменной b_post, Поэтому я пробовал ее размещать в post_list.html, внутри и вне цикла с выводом постов. Если я распологал их внутри цикла - то они работали как обычные ссылки на пост. Т.е были бесполезны. А если вне цикла - была такая же проблема. Читал о похожих проблемах, Узнал что можно чем-то заменить b_post, но так и не понял чем... Сама ошибка:
NoReverseMatch at /menu/post_list
Reverse for 'best_post' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P[0-9]+)/$']