Как исправить ошибку NoReverseMatch в Django для получения и отображения пользовательских данных в ListView
Здравствуйте, у меня есть проект веб-приложения для обмена видео с базовыми CRUD операциями в нем. Любой пользователь после успешного входа может разместить любое количество видео и после входа пользователь перенаправляется на главную страницу другого приложения внутри проекта django.
На главной странице отображаются все видео, загруженные разными пользователями. Теперь я хочу разместить все видео, загруженные пользователем, в отдельной конечной точке. Если пользователь нажмет на ссылку этой конечной точки в навигационной панели, то он должен быть направлен на эту конечную точку, содержащую все видео, загруженные им/ею.
Я использую для этого встроенное представление ListView на основе классов, и у меня только одна модель Video.
Но я получаю ошибку Noreversematch после выполнения функции get_queryset() и вот моя ошибка :
часть файла 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.