как решить, что шаблоны URL-адресов Django не работают

#python #django

Вопрос:

Я добавил путь(‘int:pk/’,…) в urls.py и доступ ‘http://127.0.0.1:8000/blog/1’

в результате получилось

«страница не найдена(404)»
Используя URLconf, определенный в doit.url, Django попробовал эти шаблоны URL в следующем порядке:

  1. блог <int:pk>/
  2. Блог
  3. администратор/

Текущий путь, 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.