19、一个完整的代码,可以从头到尾的先跑一遍,再从头来过,至少还需要学50次,很多内容还没有接触到!
Django按id显示内容列表的详情页
在Django中,你可以使用类视图DetailView来根据id展示内容的详情页。以下是一个简单的例子:
---111--- 首先,在你的models.py中定义你的【模型】(完整代码):
from django.db import models #引入django.db.models模块
#这个例子中,我们定义了两个模型类:UserInfo和PostInfo。
# UserInfo用于存储用户信息,包括用户名、密码和电子邮件地址。(后改成”栏目类别“)
# PostInfo用于存储帖子信息,包括发帖用户、标题、内容和创建时间。(后改成”内容列表“)两个模型通过ForeignKey字段关联,确保每个帖子都关联到一个用户信息。
# 输入如下模型语句后,在终端中输入 python manage.py makemigrations #生成迁移文件
# python manage.py migrate #迁移数据库,创建新表
# 就可以在 数据库sqlite3 中创建 myapp001_userinfo 和 myapp001_postinfo 这2个表及里面的字段
# 用户信息(栏目类别)模型
class UserInfo(models.Model):
username = models.CharField(max_length=30,verbose_name='栏目类别') #在二级目录中显示”栏目类别“的中文,其他类似
#verbose_name='用户名称' ,username在后台显示成中文“用户名称”
#password = models.CharField(max_length=30,verbose_name='密码')
#email = models.EmailField(verbose_name='邮箱地址')
def __str__(self):
return self.username
class Meta: #这3条语句,数据模型在后台管理列表显示为中文列表
verbose_name = ('栏目类别')
verbose_name_plural = ('栏目类别')
# 帖子信息(内容列表)模型
class PostInfo(models.Model):
user = models.ForeignKey(UserInfo, on_delete=models.CASCADE,verbose_name='栏目类别')
title = models.CharField(max_length=50,verbose_name='标题')
content = models.TextField(verbose_name='内容')
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Meta: #这3条语句,数据模型在后台管理列表显示为中文列表
verbose_name = ('内容列表')
verbose_name_plural = ('内容列表')
---222--- 然后,在views.py中定义一个【视图】来展示详情页:
from django.shortcuts import render
from myapp001.models import UserInfo
from myapp001.models import PostInfo
from django.views.generic import DetailView #详情页使用
# Create your views here.
def UserInfo_list(request): #栏目列表函数
UserInfos = UserInfo.objects.all() #列出数据库中UserInfo表的所有数据
return render(request, 'UserInfo.html', {'UserInfos': UserInfos}) #返回并在模板中渲染+赋值
def PostInfo_list(request): #内容列表函数,同上
PostInfos = PostInfo.objects.all()
return render(request, 'PostInfo.html', {'PostInfos': PostInfos})
class PostInfoDetailView(DetailView): #详情页使用
model = PostInfo
template_name = 'PostInfo_detail.html' # 确保你有这个模板文件【请手动建立,放在myapp001目录中的Templates目录中】
---333--- 接下来,在urls.py中添加一个【URL模式来映射】到这个视图:
from django.contrib import admin
from django.urls import path
from myapp001.views import UserInfo_list
from myapp001.views import PostInfo_list
from django.conf.urls import include
from myapp001.views import PostInfoDetailView #详情页使用
urlpatterns = [
path('admin/', admin.site.urls),
#path('', admin.site.urls),
#path('myapp001/', view.UserInfo_list, name='UserInfo_list'),
path('userinfos/', UserInfo_list, name='UserInfo_list'), #输入http://localhost:8000/userinfos显示栏目列表
#path('',include('myapp001.urls'))
path('', PostInfo_list, name='PostInfo_list'), #设置默认首页为内容列表,即打开http://localhost:8000后,可看到数据库中的内容,点解链接并显示详情页。
path('PostInfo/<int:pk>/', PostInfoDetailView.as_view(), name='PostInfo-detail'), #详情页链接
]
---444--- 最后,在PostInfo_detail.html【模板放在Templates目录中】中,你可以使用模型的属性来展示详情:
<!DOCTYPE html>
<html>
<head>
<title>{{ object.title }}</title>
</head>
<body>
PostInfo的详情页
<h1>{{ object.title }}</h1>
<p>{{ object.content }}</p>
</body>
</html>