#通过pycharm pro 直接创建DjangoProject1
#创建一个app,命名为DjangoWeb
python manage.py startapp DjangoWeb
#修改DjangoWeb这个app中的views.py,设置一个测试函数
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def index(request):
return HttpResponse('I get it')
#在根目录的urls.py 中添加views.index这个方法
from DjangoWeb import views
urlpatterns = [
path("admin/", admin.site.urls),
path("index/", views.index),
]
#修改根目录下settings.py,把DjangoWeb这个app挂载到INSTALLED_APPS下
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"DjangoWeb",
]
#powershell 运行 启动Django的本地维护
python manage.py runserver
#修改根目录下settiing.py中的语言源码,界面显示成中文
LANGUAGE_CODE = "zh-hans"
#在浏览器的localhost:8000/index下可以显示views.index的内容,完成基本app配置
#添加超级管理员账户,方便后台管理
python manage.py createsuperuser
#输入用户名和密码(都是isaac)
#在地址localhost:8000/admin 下登录
#进入网站后台
#以上完成DjangoProject1的初步准备,python manage.py help 可以查询命令信息
#article的添加通过DjangoWeb下的model.py完成,修改该文件
from django.db import models
# Create your models here.
#添加类
class article(models.Model): #创建article 类,继承父类,包括CharField和TextField
title=models.CharField(max_length=100) #为article 添加属性title
content=models.TextField() #为article 添加属性content
#在model.py中添加类以后,需要将这个模型迁移到数据库中,通过两步完成
python manage.py makemigration #制造迁移
python manage.py migrate #迁移
#此时,article模型已经被迁移到数据库中,数据库在根目录下的db.sqlite3
#要在后台地址看到article表,仍需要在DjangoWeb这个app的admin.py中注册article 模型
from django.contrib import admin
from DjangoWeb.models import article #加载DjangoWeb路径下model模块的article类
# Register your models here.
admin.site.register(article) #注册这个类,使之可以通过admin后台管理
######看着这个 类 熟悉的界面,原来期刊们的投稿主页都是用Django做的= = ##############
#此时article 类虽然已经部署,需要通过一个处理方法解决所有article的实例,通过每一个实例的唯一标识 id 来解决
#模型的objects是获取或操作模型的对象
#article.objects.get(条件)
#article.objects.all()
#article.objects.filter(条件)
#在views.py中定义新的处理article的函数
from django.http import HttpResponse,Http404
from django.shortcuts import render
from DjangoWeb.models import article
# Create your views here.
def index(request):
return HttpResponse('I get it')
#定义处理函数
def article_detail(request, article_id): #添加参数,article id
global article1
try:
article1=article.objects.get(id=article_id) #通过object方法,获得article 类 中,id与article id一致的实例,赋予article1
except article1.DoesNotExist: #如果无法取出实例,就调用404
raise Http404("not exist")
#成功取出实例,返回表达式的结果,article1为实例,具有module中定义的title和content属性
return HttpResponse("<h2>文章标题: %s </h2><br>文章内容: %s" % (article1.title, article1.content))
#同时在路由器urls.py中定义变量访问article的路径
from DjangoWeb import views
urlpatterns = [
path("admin/", admin.site.urls),
path("index/", views.index),
#访问article实例的路径是变量
#同时通过将客户端访问时的article id 传为 view 中定义的 article_detail函数中的 article_id参数,实现调用相应实例
path("article/<int:article_id>",views.article_detail,name="article_detail")
]
#整体逻辑就是将唯一识别的id作为变量符号,在客户端访问路径和处理函数中保持一致,从而实现动态访问所有实例
#有些期刊的网站也是这个方法,也有一些是通过doi号码,应该是规定的适合,将id替换为了doi,毕竟二者同样都是一个article实例 唯一识别的信息
#之后进行前端后端的分离,及路由分发的分离
#这部分内容需要理清每一个py文件所接收和指向的位置
#Django直接实现的前后端分离,是基于将 ‘处理方法’ 转嫁到 ‘模板’ 文件夹中的前端渲染实现的
#在 ‘app’ 下新建 ‘templates’ 文件夹,在下面建每一个页面对应的 html 文件,此时该文件即为一个前端渲染文件
#在 html 文件中接收 ‘view’ 中传递的内容并进行 ‘加工显示’ ,这部分内容通过 http 语法实现
#app中 view 的内容
from django.http import HttpResponse, Http404
from django.shortcuts import render, get_object_or_404
from DjangoWeb.models import article
# Create your views here.
#定义index显示的内容
def index(request):
return HttpResponse('I get it')
#定义处理方法,获得文章内容
def article_detail(request, article_id):
article1=get_object_or_404(article, pk=article_id) #获得每个文章的内容
context = {}
context["article_obj"] = article1 #将文章内容写入字典
return render (request, "article.detail.html", context) #render函数把字典返还到一个负责前端渲染的 html 中
#定义处理方法,获得文章列表
def article_list(request):
articles=article.objects.all() # objects.all 获得文章全部信息
context={}
context["articles"]=articles #写入到字典中
return render(request,"article.list.html",context) #同样通过render函数返还到前端的 html 中
#通过以上方法,收到request后,把相应的内容传递到相应的 html 中
#显示每个文章的标题和内容的html
#article.detail.html的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
#写出相应的渲染方法,如何显示所传递的内容
<h2>{{ article_obj.title }}</h2>
<hr>
<p>{{ article_obj.content }}</p>
</body>
</html>
#显示每个文章的标题和内容的html
#article.list.html的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>article</title>
</head>
<body>
{% for article in articles %}
#这里的渲染既显示了需要的内容,同时通过http中的<a href>语句,对路由进行了分发
<a href={% url "article_detail" article.pk %}>{{ article.title }}</a>
{% endfor %}
</body>
</html>
#路由的分发通过类似子文件夹的方法实现,即 在 全局的 urls.py 中 挂载一个 子app中的 urls.py,保证流入和指出 畅通即可
#实现结果如下
#全局的urls
from django.contrib import admin
from django.urls import path, include
from DjangoWeb import views
urlpatterns = [
path("admin/", admin.site.urls),
path("index/", views.index),
path("article/",include("DjangoWeb.urls")) #这里进行了挂载子路径,挂载通过 include 方法
]
#app中的子路由
from django.urls import path
from DjangoWeb import views
urlpatterns = [
#子路由的路径与全局路由的路径是衔接的
#下面这个path实际的绝对路径是 localhost:8000/article/<int:article_id>
path("<int:article_id>",views.article_detail,name="article_detail"),
path("", views.article_list, name="article_list")
]
#以上内容
#通过将view.py中的处理和渲染两部分内容分开,将渲染传递到单独的渲染端,实现前后端的分离
#通过渲染时的 http 语句,实现显示内容和路由地址的耦联
#通过将总路由与app内的子路由连接在一起,实现路由的分发