django
下载
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django
查看版本
django-admin --version
4.2.1
创建项目
django-admin startproject project
创建一个 app
python manage.py startapp app
注册 app
project/settings
# app名称.apps.app名称Config
INSTALLED_APPS = [
...,
'app.apps.AppConfig',
]
编写 url
project/urls
from app import views
urlpatterns = [
path('index/', views.index),
]
编写视图函数
app/views
from django.shortcuts import render, HttpResponse
def index(request):
return HttpResponse('index 函数')
启动项目
python manage.py runserver
使用 templates
app/views.py
def user_list(request):
return render(request, 'user_list.html')
模板继承
app/templates/layouts.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> {% block title %} {% endblock %}</title>
</head>
<body>
<div class="layout">
{% block content %}{% endblock %}
</div>
</body>
</html>
使用继承
{% extends 'layouts.html' %}
{% block title %}
orm
{% endblock %}
{% block content %}
<div>ormbb</div>
{% endblock %}
使用静态文件
需要重新启动才会显示图片
app/static/image/xm.png
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>use_list</h1>
<img src="{% static 'image/xm.png' %}" alt="" />
</body>
</html>
常用模板语法
app/views.py
def user_list(request):
name = 'zs'
list = ['zs', 'ls', 'xr']
dict = {"name":"xr"}
flag = False
return render(request, 'user_list.html', {
"name": name,
"list": list,
"dict": dict,
"flag": flag
})
app/templates/user_list.html
<div>
<p>{{ list.0 }}</p>
{% for it in list %}
<p>{{ it }}</p>
{% endfor %}
</div>
<div>
{% for it in dict %}
<p>{{ it }}</p>
{% endfor %}
</div>
<div>
{% if flag %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
请求与响应
app/views.py
from django.shortcuts import render, HttpResponse, redirect
def request(request):
# request是一个对象,封装了用户发送来的所有请求相关的数据
# method GET
# print('method', request.method)
# http://127.0.0.1:8000/request/?id=1&type=2 ==> GET <QueryDict: {'id': ['1'], 'type': ['2']}>
# print('GET', request.GET)
# print('POST', request.POST)
# 响应
# return HttpResponse('request')
# 重定向 是由浏览器重定向
# return redirect('http://www.baidu.com')
if request.method == 'GET':
return render(request, 'request.html')
# <QueryDict: {'csrfmiddlewaretoken': ['c5F6mUAlPwCx4sr4vrBUFmgahbFKntU5jzfsILC12ssT4wtSpwsniugHlHsVr7pH'], 'name': ['ad'], 'pwd': ['12']}>
# print('===',request.POST)
# return HttpResponse('登录成功')
name = request.POST.get('name')
pwd = request.POST.get('pwd')
if name == 'root' and pwd == '123':
return HttpResponse('登录成功')
return render(request, 'request.html', {'error_msg': "用户名密码错误"})
app/templates/request.html
<form action="/request/" method="post">
{% csrf_token %}
<input type="text" name="name" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit" value="提交">
</form>
<p>{{ error_msg }}</p>
动态传参
path('orm/<int:id>/edit/', views.orm),
http://127.0.0.1:8000/orm/2/edit/
def orm(request,id):
print(id) # 2
数据库操作
下载 mysqlclient
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysqlclient
创建数据库
create database python
Django 链接数据库
替换为 mysql 数据库
project/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'python',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
创建表和字段
app/models.py
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
执行命令
python manage.py makemigrations
python manage.py migrate
- 下面是 python manage.py makemigrations 生成的记录
- 上面是 python manage.py migrate 生成的记录
更新表结构
“”"
Please select a fix:
- Provide a one-off default now (will be set on all existing rows with a null value for this column)
- Quit and manually define a default value in models.py.
新增字段时会提示:
1 让你自己输入一个值作为新增字段的默认值
2 退出 创建字段时自己加 default=‘’
“”"
python manage.py migrate 出现报错粗暴方法把所有表删除然后把这些记录都删除
最好在创建字段时就给默认值或者允许为 Null
数据库基本操作
from app.models import UserInfo
def orm(request):
# 增
# UserInfo.objects.create(name='zs',password='123',age=18)
# UserInfo.objects.create(name='xr',password='123',age=28)
# 删
# UserInfo.objects.filter(id=1).delete()
# UserInfo.objects.all().delete()
# 查
# user_list = UserInfo.objects.all()
# user_list = UserInfo.objects.filter(id=2)
# dict = UserInfo.objects.filter(id=2).first()
# 改
UserInfo.objects.filter(id=2).update(age=66)
return HttpResponse('orm')
关联表
"""
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.
新增字段时会提示:
1 让你自己输入一个值作为新增字段的默认值
2 退出 创建字段时自己加 default=‘’
"""
class Department(models.Model):
""" 部门 """
title = models.CharField(verbose_name='标题', max_length=32)
class UserInfo(models.Model):
""" 员工 """
name = models.CharField(verbose_name='姓名', max_length=8)
password = models.CharField(verbose_name='密码', max_length=64)
age = models.IntegerField(verbose_name='年龄')
# SmallIntegerField 小整形
gender_choices = ((1, '男'), (2, '女'))
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
# 账户余额十位数 两位小数 默认值为 0
account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name='入职时间')
# 连表
# depart 字段在 Django 中会自动加上 _id 生成为 depart_id
# to 要关联的表名称 to_field 要关联的表的字段名
# on_delete=models.CASCADE() 级联删除 如果部门删除那么关联员工数据也删除
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
# on_delete=models.SET_NULL() 置空 如果部门删除那么关联员工数据部门字段置空
# depart = models.ForeignKey(to='Department', to_field='id', null=True, blank=True, on_delete=models.SET_NULL)
数据结构
+----+------+----------+-----+---------+--------+-----------+----------------------------+
| id | name | password | age | account | gender | depart_id | create_time |
+----+------+----------+-----+---------+--------+-----------+----------------------------+
| 1 | zs | 123 | 12 | 10.00 | 1 | 1 | 2023-05-17 00:00:00.000000 |
| 2 | zs2 | 123 | 12 | 10.00 | 1 | 1 | 2023-05-17 00:00:00.000000 |
| 3 | zs3 | 123 | 12 | 10.00 | 1 | 1 | 2023-05-17 00:00:00.000000 |
+----+------+----------+-----+---------+--------+-----------+----------------------------+
在 python 中写法
def user_list(request):
user_list = models.UserInfo.objects.all()
for user in user_list:
print(
user.depart_id, user.depart.title,
user.create_time, user.create_time.strftime("%Y-%m-%d %H:%M:%S"),
user.gender, user.get_gender_display()
)
return render(request, 'user_list.html', {"user_list": user_list})
# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男
# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男
# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男
在 html 模板中写法
{% for user in user_list %}
<div>
<span>{{ user.name }}</span>
<span>{{ user.get_gender_display }}</span>
<span>{{ user.create_time|date:"Y-m-d" }}</span>
</div>
{% endfor %}
zs 男 2023-05-17
zs2 男 2023-05-17
zs3 男 2023-05-17