Django 404 с существующей записью в базе данных
Я совсем новичок в django и сейчас работаю над своим первым неуправляемым проектом. Я столкнулся с проблемой, которая кажется мне очень неразумной, и я не могу решить ее самостоятельно.
В принципе, я получаю совпадение шаблона url, но также получаю 404 ошибку, что страница не найдена. Я тестировал это с различными записями, и результат всегда один и тот же - 404.
companies/urls.py
from . import views
from django.conf.urls import url
urlpatterns = [
url(r'^company/(?P<pk>)', views.CompanyDetailView.as_view(), name='company-detail')
]
Main/urls.py
rom django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('companies/', include('companies.urls'))
]
и вот сообщение об ошибке: *"Страница не найдена (404) Не найдена компания, соответствующая запросу Метод запроса: GET URL запроса: http://127.0.0.1:8080/companies/company/F/. Вызвано: companies.views.CompanyDetailView Используя URLconf, определенный в main.urls, Django попробовал эти шаблоны URL, в таком порядке:
admin/
компании/ ^company/(?P) [name='company-detail']
Текущий путь, companies/company/F/, совпал с последним.
Вы видите эту ошибку, потому что в вашем файле настроек Django установлено DEBUG = True. Измените это значение на False, и Django отобразит стандартную страницу 404. "*
Просто чтобы добавить, я могу получить доступ к записи из администратора с помощью url
http://127.0.0.1:8080/admin/companies/company/F/change/
Здесь я действительно заблудился и сомневаюсь в своем рассудке.
Отсутствует часть регулярного выражения первичного ключа, например:
urlpatterns = [
url(r'^company/(?P<pk>.*)/$', views.CompanyDetailView.as_view(), name='company-detail')
]
Если вы работаете с url(…)
, то он ожидает, что для параметров вы добавите regex для захвата значения. Если вы не укажете никакого regex между скобками, то шаблон будет считаться пустым, и, следовательно, параметром будет пустая строка.
Я не знаю, является ли pk
хорошим названием параметра, поскольку вы передаете ему такие элементы, как F
. возможно, его следует переименовать в slug
или что-то подобное.
Примечание: Начиная с версии django-3.1,
url(…)
[Django-doc] является deprecated в пользуre_path(…)
[Django-doc]. Кроме того, был введен новый синтаксис для путей с конвертерами путей: вы используетеpath(…)
[Django-doc] для этого.