Как исправить ошибку NoReverseMatch в Django для получения и отображения пользовательских данных в ListView

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

На главной странице отображаются все видео, загруженные разными пользователями. Теперь я хочу разместить все видео, загруженные пользователем, в отдельной конечной точке. Если пользователь нажмет на ссылку этой конечной точки в навигационной панели, то он должен быть направлен на эту конечную точку, содержащую все видео, загруженные им/ею.

Я использую для этого встроенное представление ListView на основе классов, и у меня только одна модель Video. Но я получаю ошибку Noreversematch после выполнения функции get_queryset() и вот моя ошибка : Endpoint page showing error часть файла views.py

class UserUploads(LoginRequiredMixin, ListView):
model = Video
template_name = 'courses/user_uploads.html'
context_object_name = 'videos'


def get_queryset(self):
    user = get_object_or_404(User, username=self.kwargs.get('username'))
    return Video.objects.filter(uploader=user).order_by('-date_time')


def get_success_url(self):
    return reverse('courses:video-detail', kwargs={'pk': self.object.pk})

часть urls.py

from django.urls import path, include
from django.contrib import admin
from . import views
from .views import CreateVideo, DetailVideo, UpdateVideo, DeleteVideo
app_name = "courses"

urlpatterns = [
    path('', views.Index.as_view(), name = "home"),
    path('user-uploads/<str:username>', views.UserUploads.as_view(), name = "user-uploads"),
    path('create-video',  CreateVideo.as_view(), name='video-create'),
    path('<int:pk>/', DetailVideo.as_view(), name='video-detail'),
    path('<int:pk>/update-video', UpdateVideo.as_view(), name='video-update'),
    path('<int:pk>/delete-video', DeleteVideo.as_view(), name='video-delete'),
]

html документ навигационной панели домашней страницы, содержащий видеоролики всех различных пользователей

{% block content %}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="create-video">Create Video</a>
            </li>
            
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="{% url 'courses:user-uploads' user.username %}">Your Videos</a>
            </li>
            
            </ul>
            <ul class="nav-item">
                <a class="nav-link active" aria-current="page" href="/logout">Log-Out</a>
            </ul>
            
        </div>
    </div>
</nav>

courses:user_uploads.html

{% extends "base.html" %}
{% block title %} Your Courses {% endblock %}
{% block content %}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="create-video">Create Video</a>
            </li>
                        
            </ul>
            <ul class="nav-item">
                <a class="nav-link active" aria-current="page" href="/logout">Log-Out</a>
            </ul>
            
        </div>
    </div>
</nav>

    <h1>Your Uploads</h1>

    <div class="container">
        <div class="row justify-content-center">
            {% for video in videos %}
            <div class="card col-md-3 col-sm-12 mr-md-2 mt-5 p-3 border-0">
                <a href="{% url 'courses:video-detail' video.pk %}"><img src="/media/{{ video.thumbnail }}" width="256" height="144"></a>
                <div class="card-body">
                    <a class="link-text" href="{% url 'courses:video-detail' object.pk %}"><h5 class="text-center">{{ video.caption }}</h5></a>
                    <p class="text-muted text-center m-0">{{ video.uploader }}</p>
                    <p class="text-muted text-center">{{ video.date_time | date:"M d, Y" }}</p>
                </div>
            </div>
            {% endfor %}
        </div>
    </div>

{% endblock %}

Проблема в следующем коде, потому что video.pk является пустой строкой.

<a href="{% url 'courses:video-detail' video.pk %}">

Это можно определить, поскольку в сообщении об ошибке говорится, что обратная операция была выполнена с аргументами ('',), что указывает на то, что была передана пустая строка для позиционного аргумента.

У модели Video есть поле, указанное для первичного ключа, или она использует автоматическое поле id, предоставляемое Django? Вы можете захотеть использовать это конкретное поле или .id, если оно использует автоматический id.

Вернуться на верх