Обратный запрос для 'Tools' без аргументов не найден. Проверен 1 шаблон(ы): ['home/(?P<category>[^/]+)\\\Z']]

Основываясь на ответе на мой предыдущий вопрос здесь

Вот мой html-код:

<a href="{% url 'Tools' %}"><p>Tools</p></a>

Когда я использовал категорию, подобную этой def home( request,category) в своих представлениях, я получил ошибку позиционного аргумента, поэтому я использовал вот это :

def home( request,**kwargs ):
    p=product.objects.filter(category__name= category)
    return render(request,'home.html',{'p':p})

Это URLs:

urlpatterns = [
    
    path('',views.home),
    path('home/<str:category>', views.home,name='Tools'),
    
]

Но после перехода на этот URL http://127.0.0.1:8000/home/Tools я получил эту ошибку :

NoReverseMatch at /home/Tools
Reverse for 'Tools' with no arguments not found. 1 pattern(s) tried: ['home/(?P<category>[^/]+)\\Z']

Почему я получаю эту ошибку?

Или как я могу решить эту ошибку home() missing 1 required positional argument: 'category'

если я хочу использовать это : def home( request,category)?

Ошибка, которую вы видите, означает, что Tools URL ожидает один параметр. Поэтому следующее:

<a href="{% url 'Tools' 'some_category' %}"><p>Tools</p></a>

является приемлемым. Если вы хотите иметь Tools представление без категории, вам нужен другой URL, который не требует этого (или regex в существующем для разрешения пустой категории, но это более подвержено ошибкам в целом):

# urls.py

urlpatterns = [
    path('', views.home),
    path('home', views.home, name='Tools'),
    path('home/<str:category>', views.home, name='Tools'),    
]
# views.py

def home(request, category=None):  # Note default value
    p = product.objects.all()  # Why is your model class name lowercase?..
    if category is not None:
        p = p.filter(category__name=category)

    return render(request, 'home.html', {'p':p})

Также вы можете использовать

path('home', views.home, {'category': None}, name='Tools')

в urls.py вместо значения аргумента по умолчанию.

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