Django 是一个开源的 Python Web 框架,旨在帮助开发者快速创建高效、可扩展的 Web 应用。
安装django: pip install django
创建django项目: django-admin startproject myproject
启动服务器: python .\manage.py runserver
文件作用:
根目录/manae.py 项目的管理脚本 如启动服务器runserver 数据库迁移migrate 创建管理员账号createsuperuser 如启动python manage.py runserver
init.py 空文件, 子目录可以作为模块导入
settings.py 核心配置文件,包括 数据库配置 已安装的应用 中间件 模板路径
urls.py 定义项目的URL路由 决定了用户访问某个URL时应该调用哪个视图
asgi.py/wsgi.py 一个是异步服务器接口,一个是同步服务器接口
子应用路由转发逻辑
创建一个子应用
python manage.py startapp myapp
子应用路由转发逻辑
首先是根目录下/urls.py定义根的转发方式
路由——子路由——视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from django.contrib import admin from django.urls import path,include
urlpatterns = [ path('admin/', admin.site.urls), path('',include('myapp.urls')), ]
定义一个根的转发,转发到myapps的路由文件中 ↓ from django.urls import path
from .views import home
urlpatterns = [ path('',home,name='home') ]
转发到home这个视图下,位于views.py
from django.http import HttpResponse
def home(request): return HttpResponse('hello,django')
|
那么现在访问根目录 出来的就是hello,django
使用ORM模型
ORM是对象关系映射模型 使用python类来定义数据表
django中每个模型通常对应数据库中的一个表 每个属性对应表中的一列
数据库迁移
生成迁移文件 python manage.py makemigrations
数据库迁移(应用迁移)python manage.py migrate
数据库迁移并不是运维讲的数据库迁移 而是更新数据库的意思
当模型定义发生变化时(如添加新字段),Django通过迁移机制来更新数据库表结构。开发者首先使用python manage.py makemigrations命令生成迁移文件,然后使用python manage.py migrate命令应用这些迁移,从而更新数据库。
定义一个模型
1 2 3 4 5 6 7 8 9 10 11
| from django.db import models
class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True)
def __str__(self): return self.title
|
生成一个表
1 2
| python manage.py makemigrations python manage.py migrate
|
往数据库中添加数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| py .\manage.py shell >>> from myapp.models import Article >>> article=Article(title='First Article',content='this is content') 实例化一条数据article
>>> article.save() 保存到数据库中
>>> article=Article(title='Sencend Article',content='this is content') >>> article.save()
调用article.objects.all()方法查看 >>> articles=Article.objects.all() >>> for article in articles: ... print(article.title) ... First Article Sencend Article
|
视图——渲染模板
在路由到视图时,视图可以选择多种方式进行实现,如
1.基于模板引擎来渲染html
2.直接返回HTML字符串
3.返回json数据
4.重定向到另一个url
5.处理表单提交
前面我们直接返回的是一个字符串
这里我们来使用模板进行渲染
创建模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>My Articles</title> </head> <body> <h1>Articles</h1> <ul> {% for article in articles %} <li>{{ article.title }}</li> {% endfor %} </ul> </body> </html>
|
修改视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from django.shortcuts import render from django.http import HttpResponse from .models import Article
def home(request): Articles=Article.objects.all() return render(request,'home.html', {'articles':Articles}) ''' render是django提供的快捷渲染函数 request是传入的请求 'home.html'要渲染的html文件 {'article'}字典,让html的article值为遍历的articles值 '''
|

创建与处理表单
分4步
1.创建一个表单类,来处理某种类型的表单请求
2.创建一个新的视图,来获取提交上来的POST请求,并做出处理
3.定义路由,指向新的视图
4.写一个html,用以提交表单
创建表单类
1 2 3 4 5 6 7 8 9
| 创建forms.py
from django import forms
class ArticleForm(forms.Form): title = forms.CharField(label='Title',max_length=100) content = forms.CharField(label='Content',widget=forms.Textarea)
|
创建新视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 在views.py中添加
def create_article(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): title = form.cleaned_data['title'] content = form.cleaned_data['content'] Article.objects.create(title=title,content=content) return redirect('home') else: form = ArticleForm() return render(request,'create_article.html',{'form':form})
|
定义新路由
1 2 3 4 5 6 7
| from django.urls import path from .views import home,create_article
urlpatterns = [ path('',home,name='home'), path('create/',create_article,name='create') ]
|
创建带表单的html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Create new Article</title> </head> <body> <h1>Create new Article</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="sumbit">Submit</button> </form> </body> </html>
|
用户注册
1.添加用户注册视图,从表单中获取账号密码,并对数据库进行操作
2.添加到达用户注册视图的路由
3.写提供用户注册表单的html
添加视图
1 2 3 4 5 6 7 8 9 10 11 12
| 定义一个新函数进行注册 def register(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = User.objects.create_user(username=username,password=password) return redirect('home') return render(request,'register.html')
|
添加路由
1 2 3 4 5 6 7 8 9 10 11
| from django.urls import path
from .views import home,create_article from .views import register
urlpatterns = [ path('',home,name='home'), path('create/',create_article,name='create'), path('register/',register,name='register') ]
|
创建register的html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <h1>Register</h1> <form method="post"> {% csrf_token %} <label for="username">Username:</label> <input type="text" name="username" required> <label for="password">Password:</label> <input type="password" name="password" required> <button type="submit">Register</button> </form> </body> </html>
|
用户登录
步骤与用户注册相同
1.写一个负责login的视图函数,函数中进行账号密码验证,并将通过的标记为已
2.定义新的路由,指向login视图
3.写login的html
user_login视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def user_login(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request,username=username,password=password) if user is not None: login(request,user) return redirect('home') return render(request,'login.html')
|
login路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from django.urls import path
from .views import home,create_article from .views import register from .views import user_login
urlpatterns = [ path('',home,name='home'), path('create/',create_article,name='create'), path('register/',register,name='register'), path('login/',user_login,name='user_login') ]
|
写一个login.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>user_login</title> </head> <body> <h1>User_login</h1> <form method="post"> {% csrf_token %} <label for="username">Username:</label> <input type="text" name="username" required> <label for="password">Password:</label> <input type="password" name="password" required> <button type="submit">Login</button> </form> </body> </html>
|