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

Да, я пытался так сделать,

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

но он все равно не выводит мне список "категорий" и "товаров" и вот так я тоже пытался вывести:

def index(request, cat_id=None):

Но затем я получаю:

AttributeError at /goods/
'tuple' object has no attribute 'get'
 Request Method:    GET
 Request URL:   http://localhost:8000/goods/
 Django Version:    4.0.4
 Exception Type:    AttributeError
 Exception Value:   
 'tuple' object has no attribute 'get'
Exception Location:  
C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\lib\site- 
packages\django\middleware\clickjacking.py, line 27, in process_response
Python Executable:   
C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\python.exe
Python Version: 3.9.10
Python Path:    
['C:\\Users\\artiom.oriol\\Documents\\DjangoProjects\\lessons',
'C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\python39.zip', 'C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\DLLs', 'C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\lib', 'C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39', 'C:\Users\artiom.oriol\AppData\Local\Programs\Python\Python39\lib\site-packages'] Server time: Wed, 27 Apr 2022 12:05:27 +0000

Эту ошибку.

Я так же сделал модели и импортировал их :

from lesson.models import Category, Good, Client

Ответы (1 шт):

Автор решения: Protect children of Donbas2014

У Вас функция требует аргумента 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})
→ Ссылка