Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。本质上和MVC模式一样。
# 在安装好python的基础上使用pip安装
pip insatll django==3.2.13
# 查看Django版本
python -m django --version
#
django path()函数
path(route, view, kwargs=None, name=None)
打开终端—进入目录—执行命令
# 配置好环境变量
django-admin startproject project-name
要求pycharm专业版
# 项目默认文件介绍
.mydjango
|-- mydjango
| |-- __init__.py
| |-- asgi.py # 接受网络请求,不用修改
| |-- settings.py # 项目配置文件,比如数据库配置等
| |-- urls.py # URL和Python函数的对应关系
| `-- wsgi.py # 接受网络请求,不用修改
`-- manage.py # 项目管理脚本,不用修改
# django的app思想,一般项目下创建一个app即可
- 项目
-app 用户管理
-app 订单管理
-app 后台管理
-app .....
# 命令行启动
python manage.py runserver
# pycharm启动
社区版本不支持
在每个app目录下,单独创建templates目录,用于放置HTML文件
若在根目录下创建templates目录,则要在setting.py文件中,配置模板的路径
# render函数
def function(request):
render(request,"templates.html")
一般把图片、css、js、plugins都当做静态文件处理
对于静态文件的管理,需要创建static目录
# 目录结构
-app
-static
-css
-img
-js
-plugins
本质上:在html文件中写一些占位符,最后由数据对这些占位符进行替换和处理
# if标签
{% if condition %}
... display
{% endif %}
# if/else标签
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
# for标签
{% for item in n1 %}
<div>{{item}}</div>
{% endfor %}
# urls.py
# 新闻中心链接
path('news', views.news)
# views.py
# 定义news函数
def news(request):
# 1.定义一些新闻(字典或者列表) 或 去数据库
# 2. 网络请求爬联通的新闻数据
# 向地址发送请求
import requests
res = requests.get("http://www.chinaunicom.com.cn/api/article/NewsByIndex/2/2022/11/news")
data_list = res.json()
print(data_list)
return render(request, 'news.html',{"news_list":data_list})
# news.html
<h1>联通新闻中心</h1>
<ul>
{% for items in news_list %}
<li>{{items.news_title}} {{items.post_time}}</li>
{% endfor %}
</ul>
{% csrf_token %} 标签:csrf 全称是 Cross Site Request Forgery,这是 Django 提供的防止伪装提交请求的功能,POST 方法提交的表格必须有此标签。
# urls.py
# 用户登录
path('login/', views.login)
# views.py
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
# 如果是POST请求,获取用户提交的数据
print(request.POST)
username = request.POST.get("user")
password = request.POST.get("pwd")
if username == 'root' and password == "123":
#return HttpResponse("登录成功")
return redirect('http://www.baidu.com')
else:
# return HttpResponse("登录失败")
return render(request, "login.html", {"error_msg":"用户名或密码错误"})
# login.html
<h1>用户登录</h1>
<form method="post" action="/login/">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit" value="提交"/>
<span style="color:red;">{{ error_msg }}</span>
</form>
pip install mysqlclient
ORM可以帮助我们做两件事情:
create database mydjango DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
项目使用sqlite数据库,这里只是链接配置不同,其他数据库操作一致
在setting.py文件中进行配置和修改
python manage.py makemigrations # 告诉django我要更改数据库了
python manage.py migrate # 更改数据库
注意事项:在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:
age = models.IntegerField(default=18)
data = models.IntegerField(null=True, blank=True)
以后开发中如果想要对表结构进行调整:
python manage.py makemigrations
python manage.py migrate
def orm(request):
from app01.models import UserInfo, Department
# 1.新建数据
UserInfo.objects.create(name='张启航', password='123',age=24)
UserInfo.objects.create(name='黄轶飞', password='123',age=19)
Department.objects.create(title='销售部')
Department.objects.create(title='人事部')
# 2.删除数据
UserInfo.objects.filter(id=2).delete()
Department.objects.all().delete()
# 3.获取数据
# 3.1获取符合条件的所有数据,返回QuerySet对象
data_list = UserInfo.objects.all() # QuerySet对象
for obj in data_list:
print(obj.id, obj.name,obj.password,obj.age)
# 3.2获取第一条数据,返回对象
UserInfo.objects.filter(id=1).first()
# 4.更新数据
UserInfo.object.all().updata(password='999')
UserInfo.object.all().filter(id=2).updata(password='999')
UserInfo.object.all().filter(name="张启航").updata(password='999')
return HttpResponse('操作成功')
http://127.0.0.1:8000/info/delete/?nid=1
http://127.0.0.1:8000/info/delete/?nid=2
http://127.0.0.1:8000/info/delete/?nid=3
def info_delete(request):
nid = request.GET.get('nid')
UserInfo.objects.filter(id=nid).delete()
return HttpResponse("删除成功")