@CleRleQ
Учусь программированию, люблю игры.

Как исправить ошибку '{'pk': ''}' not found?

Создаю функцию для сайта - "Лучший пост" или что то вроде того. Суть в том что при переходе по ссылке, пользователя должно направить на статью с самым большим кол-вом лайков.

Мой 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]+)/$']
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
ValarMayar
@ValarMayar
Д У Р А Ч О К / недопрограммист графоман
А почему у вас 2 views обслуживает 1 url?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы