#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. Я не уверен, что понимаю ваш ответ…