Ошибка Django 404 2458 при запросе объектов по идентификатору

#python #django

Вопрос:

Я слежу за этим видео, пытаясь выучить Джанго. Я завершил этот учебник, и у меня была та же проблема, даже когда я следовал коду до T.

Я пытаюсь получить информацию об объекте модели, отображаемом на веб-странице, при вводе идентификатора объекта непосредственно в URL, например http://localhost:8000/app/item/1/ или http://localhost:8000/app/item/2/ как показано на видео (7:30 в видео). Но когда я пытаюсь, я получаю эту ошибку:

введите описание изображения здесь


Исходный код из видео:

views.py:

 from django.shortcuts import render
from django.http import HttpResponse
from .models import Book 


def index(request):
    return HttpResponse('Hello, world!')

def book_by_id(request, book_id):
    book = Book.objects.get(pk=book_id)
    return HttpResponse(f"Book: {book.title}, published on {book.pub_date}")
 

models.py:

 from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)  
    pub_date = models.DateTimeField('date published')  
 

urls.py:

 from django.utils import path
from . import views


urlpatterns = [
    path('', views.index, name='index'),
    path('book/<int:book_id>', views.book_by_id, name='book_by_id'),
]
 

Мой код:

views.py:

 from django.shortcuts import render
from django.http import HttpResponse
from .models import Item


def index(request):
    return HttpResponse('Hello, world!')

def item_by_id(request, item_id):
    item = Item.objects.get(pk=item_id)
    return HttpResponse(f"Item: {item.title}, published on {item.datetime_found}")
 

models.py:

 from django.db import models
from django.utils.timezone import now

class Item(models.Model):
    title = models.CharField(max_length=200)  # Short description of the item
    datetime_found = models.DateTimeField(default=now, blank=True)  # Date and time of when the item was found
 

urls.py:

 from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('item/<int:item_id>', views.item_by_id, name='item_by_id'),
]
 

Уровень проекта urls.py:

 from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
 

Что я неправильно понимаю в запросе на получение? Я чувствую, что изменения, которые я внес, минимальны. И я все перенес правильно. (Я думаю)

Комментарии:

1. Попробуйте удалить завершающую косую черту из вашего URL-адреса (или наоборот, добавьте завершающую косую черту в свой path() вызов).

2. Я пробовал и то, и другое, но все равно получаю одну и ту же страницу с ошибкой

3. У вас есть уровень проекта urls.py или это сами URL-адреса вашего уровня проекта? Если это так, то откуда вы ожидаете, что app это появится в ваших URL-адресах (я не вижу этого в вашем шаблоне)?

4. Да, у меня есть уровень проекта urls.py. Я отредактировал свой вопрос, чтобы включить его

5. Ну, опять же, откуда вы ожидаете app взяться? В учебнике, о котором вы говорите, вероятно, было что-то вроде path('app/', include('theirapp.urls')), . Скорее всего, вы захотите написать URL-адрес, как http://localhost:8000/item/1/ в вашем браузере.

Ответ №1:

Используйте это

 from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('app/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
 

или вы можете удалить «приложение» со своего URL-адреса и сделать его похожим на это http://127.0.0.1:8000/item/1

Комментарии:

1. По какой причине вы удалили свой другой ответ? Вы же знаете, что можете редактировать, верно? Чуть ниже текста сообщения слева от вашей карточки пользователя есть кнопка редактирования.

2. Да, я знаю, это просто не приходило мне в голову.

Ответ №2:

посмотрите на ваш шаблон URL и оригинал.

path('item/<int:item_id>', views.item_by_id, name='item_by_id'),

это твое

path('book/<int:book_id>', views.book_by_id, name='book_by_id'), является ли оригинал

Комментарии:

1. да, я создал функцию item_by_id вместо оригинальной функции book_by_id в views.py. Я не уверен, что понимаю ваш ответ…