Django "NoReverseMatch: Reverse for 'ads.views.AdListView' not found" при выполнении Test

Я реализовал несколько тестов для проверки кода состояния некоторых страниц, но этот тест с обратной функцией выдает ошибку: django.urls.exceptions.NoReverseMatch: Reverse for 'ads.views.AdListView' not found. 'ads.views.AdListView' не является допустимой функцией представления или именем шаблона.

Читая документацию и некоторые ответы на stackoverflow, я должен использовать либо имя функции представления, либо имя шаблона внутри скобки обратной функции, но ни один из них, похоже, не работает.

Вот мой код:

ads/tests/test_urls.py

from django.test import TestCase
from django.urls import reverse


class SimpleTests(TestCase):
    def test_detail_view_url_by_name(self):
        resp = self.client.get(reverse('ad_detail'))
        # I've also tried: resp = self.client.get(reverse('ads/ad_detail'))
        self.assertEqual(resp.status_code, 200)
...

ads\urls.py

from django.urls import path, reverse_lazy
from . import views


app_name='ads'

urlpatterns = [
    path('', views.AdListView.as_view(), name='all'),
    path('ad/<int:pk>', views.AdDetailView.as_view(), name='ad_detail'),
    ...
    ]

mysite/urls.py

from django.urls import path, include

urlpatterns = [
    path('', include('home.urls')),  # Change to ads.urls
    path('ads/', include('ads.urls')),
    ...
    ]

ads/views.py

class AdDetailView(OwnerDetailView):
    model = Ad
    template_name = 'ads/ad_detail.html'
    
    def get(self, request, pk) :
        retrieved_ad = Ad.objects.get(id=pk)
        comments = Comment.objects.filter(ad=retrieved_ad).order_by('-updated_at')
        comment_form = CommentForm()
        context = { 'ad' : retrieved_ad, 'comments': comments, 'comment_form': comment_form }
        return render(request, self.template_name, context)

Я новичок в Django, поэтому я не очень понимаю, что происходит. Есть идеи о том, что вызывает проблему? Заранее спасибо

Поскольку вы используете app_name=… в вашем urls.py, вам нужно указать это как пространство имен в имени представления, поэтому ads:ad_detail, и указать первичный ключ:

resp = self.client.get(reverse('ads:ad_detail', kwargs={'pk': 42}))

Здесь мы посещаем URL, где 42 используется как значение для параметра URL pk.

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