#python #django
Вопрос:
Я добавил путь(‘int:pk/’,…) в urls.py и доступ ‘http://127.0.0.1:8000/blog/1’
в результате получилось
«страница не найдена(404)»
Используя URLconf, определенный в doit.url, Django попробовал эти шаблоны URL в следующем порядке:
- блог <int:pk>/
- Блог
- администратор/
Текущий путь, blog/1, не соответствовал ни одному из них.
кроме того, я сделал содержимое 3 пк
пожалуйста, помогите мне, я долго страдал.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('<int:pk>/', views.PostDetail.as_view()),
path('', views.PostList.as_view()),
]
models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
created_at = models.DateTimeField()
def __str__(self):
return f'[{self.pk}]{self.title}'
views.py
from django.views.generic import ListView, DetailView
from .models import Post
class PostList(ListView):
model = Post
ordering = '-pk'
class PostDetail(DetailView):
model = Post
post_list.html
<!DOCTYPE html>
<html lang = "ko">
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
{% for p in post_list %}
<hr/>
<h2> {{ p.title }} </h2>
<p> {{ p.content }}</p>
<h4> {{ p.created_at }} </h4>
{% endfor %}
</body>
</html>
post_detail.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset = "UTF-8">
<title> {{ post.title }} - Blog </title>
</head>
<body>
<nav>
<a href="/blog/">Blog</a>
</nav>
<h1> {{ post.title }} </h1>
<h4> {{ post.created_at }} </h4>
<p> {{ post.content }} </p>
<hr/>
<h3> ... </h3>
</body>
</html>
Комментарии:
1. Вероятно, нет строк с pk=1?
2. вы должны отобразить html-файл в своем views.py
Ответ №1:
Попробуйте так, пожалуйста
urlpatterns = [
path('', views.PostList.as_view()),
path('post/<int:pk>/', views.PostDetail.as_view()),
]
Ответ №2:
Я не знаю, как вы спроектировали свой проект, но я предполагаю, что вы создали отдельный urls.py файл внутри вашего приложения, если вы сделали это, вы делаете некоторые вещи неправильно в коде, который вы указали в этом вопросе. Вы не заявляете app_name
о том, что в вашем urls.py файл, это действительно затрудняет вам создание ссылок для ваших страниц позже, когда вы расширяете свой проект, а также делает невозможным доступ к страницам, я дам вам некоторый код, но убедитесь, что вы его прочитали и адаптировали к своему проекту.
Это должно быть вашим urls.py в папке проекта:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('your_app_name.urls'))
]
После этого вы должны создать urls.py файл в папке вашего приложения и сделайте так, чтобы он выглядел следующим образом:
from django.urls import path
from .views import *
app_name = "your_app_name"
urlpatterns = [
path('<int:pk>/', PostDetail.as_view(), name='post_detail'),
path('', PostList.as_view(), name='post_list'),
]
Обратите внимание, что я изменил способ импорта представлений , таким образом, вам не нужно писать views.PostDetail.as_view()
, вы можете просто называть его именем класса. Я также добавил имя для каждого шаблона URL-адреса, с его помощью вы можете создавать ссылки намного проще, как я уже упоминал ранее, вы создаете тег a в HTML, который будет выглядеть так:
<a href='{% url 'your_app_name:post_list %}'>Blog</a>
Применив эти изменения к вашему коду, он, вероятно, будет работать нормально, но если это не так, не стесняйтесь обращаться ко мне. Также попробуйте узнать о представлениях на основе функций в Django, их лучше использовать, так как с представлениями на основе классов вы нарушаете СУХУЮ(не повторяйтесь) концепцию Django.