Index() missing 1 required positional argument: 'cat_id'

Учусь по книге "Django Практика" Владимир Дронов. И вот застрял на примере, где он выводит список моделей на веб страницу. Объясняет сжато, код относительно понятен, но вот запнулся....

views.py

from django.shortcuts import render
from django.http import HttpResponse
from lesson.models import Category, Good, Client

def index(request, cat_id):
   cats=Category.objects.all().order_by('name')
   if cat_id ==None:
      cat=Category.objects.first()
   else:
      cat = Category.objects.get(pk=cat_id)

   goods=Good.objects.filter(category=cat).order_by('name')
   return cat_id, render(request, "index.html", {'category':cat, "cats":cats, "goods":goods})

urls.py

from lesson import views
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('goods/', views.index),
]

я все же подозреваю, что он забыл указать что то, либо я что то пропустил... либо разница в версиях самого Django, все же книга 2016 года.... Но вот я не могу вывести html страничку со списком товаров. при чем как я понял, что при клике на какую то из ссылок должна открываться страничка с адресом : path('goods/<int:cat_id>', views.index),

но я все получаю ошибку : index() missing 1 required positional argument: 'cat_id'

Направьте пожалуйста в нужное русло...

стек с ошибкой :

[27/Apr/2022 14:24:20] "GET /goods HTTP/1.1" 301 0
Internal Server Error: /goods/
Traceback (most recent call last):
   File 
 "C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\lib\site- 
packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File 
"C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\lib\site- 
packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, 
**callback_kwargs)
TypeError: index() missing 1 required positional argument: 'cat_id'
[27/Apr/2022 14:24:20] "GET /goods/ HTTP/1.1" 500 59421

У Вас функция требует аргумента cat_id, а url его не передает.

Можно его добавить например вот так:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('goods/<int:cat_id>', views.index),
]

Альтернативный (и дополнительный) вариант - сделать фунцию index с аргументом cat_id "по умолчанию".

Например так:

def index(request, cat_id=None):

К тому, же у Вас зачем то функция возвращает tuple

return cat_id, render(request, "index.html", {'category':cat, "cats":cats, "goods":goods})

Должно быть как то так:

return render(request, "index.html", {'category':cat, "cats":cats, "goods":goods})
Вернуться на верх