Что вызывает ошибку Unexpected Keyword 500 при попытке передать данные из URL в качестве переменной с помощью Django?

Я прохожу онлайн-курс и воспроизвожу код преподавателя на моем Mac в VS Code, чтобы помочь мне узнать, как он работает; и это не проблема домашнего задания. Преподаватель показывал, как динамически создавать ответы на основе URL, отправляя последнюю часть url в качестве переменной в функцию, которая затем генерирует ответ. Однако, когда я пробую это сделать, я получаю ошибку 500. Я просмотрел свой код, и он выглядит идентично инструкциям, только с добавленными комментариями. Фиксированные пути работают нормально, т. е.

    path("brian", views.brian, name = "brian"),

работает нормально, но вот это не получается:

    path("<str:name>", views.greet, name = "greet")

ошибка:

[18/Jul/2024 20:50:39] "GET /hello/jim HTTP/1.1" 500 59430
[18/Jul/2024 20:50:41] "GET /hello/ HTTP/1.1" 200 5
Internal Server Error: /hello/jim
Traceback (most recent call last):
  File "/Users/XXX/Documents/Work/Python Projects/Dashboard/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/XXX/Documents/Work/Python Projects/Dashboard/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: greet() got an unexpected keyword argument 'Name'

Я создал несколько фрагментов кода: (комментарии мои, чтобы потом, когда я вернусь к коду, я мог его понять)

  1. Создано приложение hello и добавлено к установленным приложениям в settings.py
ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = ['hello',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
] # which apps - such as hello to include in web app

2. Определен путь для использования в urls.py в каталоге hello:

from django.urls import path
from . import views
   
urlpatterns =[
    path("", views.index, name = "index"),
    path("brian", views.brian, name = "brian"),
    path("<str:name>", views.greet, name = "greet")
    ]#returns the function greet from views as a web page for /hello paths, "brian" adds /brian to end of hello as web page to load

3. Добавлены urlpatterns в urls.py в корневом каталоге проекта

from django.contrib import admin
from django.urls import include, path
   
urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', include("hello.urls")) # tells django to include urls from urls file in hello
   ]

4. Определена функция "greet" в файле views.py в каталоге hello:

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("Hello")

def brian(request):
    return HttpResponse("Hello Brian")

def greet(request, new_name):
    return HttpResponse(f"Hello,{new_name}") # fstring - says use the value of {name} in displayed text; parameter name is a returned variable to greet

когда я на локальном сервере ввожу url, например:

http://127.0.0.1:8000/hello/brian -> работает, как и ожидалось

http://127.0.0.1:8000/hello/jim -> Я получаю ошибку 500, о которой я говорил выше.

Имя параметра по-прежнему должно быть name, поэтому:

def greet(request, name):
    return HttpResponse(f"Hello,{new_name}")

Проблема заключается в самом url.

    path("<str:name>", views.greet, name = "greet")

измените url следующим образом

path("<str:new_name>", views.greet, name = "greet")

ваш параметр должен совпадать с именем параметра, указанным в url

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