Django
大约 3 分钟
Django
项目结构
- 入口app 默认和项目同名
asgi.py 接收网络请求(异步)
wsgi.py 接收网络请求(同步)
urls.py 路由
settings.py 配置文件
__init__.py
- app1
__init__.py
apps.py app启动类
admin.py 默认提供的后台管理
models.py 操作数据库
tests.py 单元测试
views.py 与url对应的函数
- migrations 数据库变更记录
__init__.py
manage.py 项目管理文件,启动项目,创建app,数据管理
app就是类似java的模块,使用manage.py创建app
python manage.py startapp app名称
settings.py
INSTALLED_APPS = [
...
'app1.apps.App1Config'
]
hello Django
urls.py
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index', views.index)
]
views.py
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("hello django")
返回页面
def user_list(request):
return render(request,'user_list.html') ## 在app目录下的templates目录下创建页面,静态文件放在static中
模板语法
def user_list(request):
name = 'li'
roles = [1,2,3]
info = {"name":"li","age":11}
return render(request,'user_list.html',{name:name,roles:roles,info:info})
<div>
{{name}}
</div>
<div>
{% for item in roles %}
<span>{{item}}</span>
{% endfor %}
</div>
<div>
{% for k,v in info.items %}
<span>{{k}}:{{v}}</span>
{% endfor %}
</div>
{% if name == 'li' %}
<h1>+++++++</h1>
{% else %}
<h1>-------</h1>
{% endif %}
资源引入
<link rel="stylesheet" href="{% static 'plugin...min.css' %}">
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
模板继承
定义模板layout.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugin...min.css' %}">
{% block css %}{% endblock %} <!--相当于插槽-->
</head>
<body>
<h1>标题</h1>
<div>
{% block content %}{% endblock %} <!--相当于插槽-->
</div>
<h1>底部</h1>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
{% block js %}{% endblock %} <!--相当于插槽-->
</body>
</html>
继承
{% extends 'layout.html' %} <!--继承-->
{% block css %} <!--填充插槽-->
<link rel="stylesheet" href="{% static 'pluxxx.css' %}">
<style>
...
</style>
{% endblock %}
{% block content %} <!--填充插槽-->
<h1>首页</h1>
{% endblock %}
{% block js %} <!--填充插槽-->
<script src="{% static 'js/jqxxxin.js' %}"></script>
{% endblock %}
请求
request.GET ## url中的参数
request.POST ## 请求体
响应
return HttpResponse("hello django")
return render(request,'user_list.html',{name:name,roles:roles,info:info})
return redirect('http://www.baidu.com')
数据库
pip install mysqlclient
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gx_day15', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # 那台机器安装了MySQL
'PORT': 3306,
}
}
models.py --- 自动创建、修改、删除表
class UserInfo(models.Model):
name = models.CharField(verbose_name='姓名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='账户', max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name='创建时间')
## 代码约束 --- 可选项
gender_choices = (
(1, '男'),
(2, '女'),
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
## 外键 to-关联的表,to_field关联字段,on_delete删除时的选项:CASCADE一起删,SET_NULL置空
## null是否可以为空
depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
depart = models.ForeignKey(to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)
python manage.py makemigrations
python manage.py migrate
增删改查
UserInfo.objects.create(name="li", password="xxxxx", age=18) # 增
UserInfo.objects.filter(id=3).delete() # 删
UserInfo.objects.filter(id=3).update() # 改
UserInfo.objects.filter(id=3) # 查: 是一个对象的列表
查
models.PrettyNum.objects.filter(id=12) # 等于12
models.PrettyNum.objects.filter(id__gt=12) # 大于12
models.PrettyNum.objects.filter(id__gte=12) # 大于等于12
models.PrettyNum.objects.filter(id__lt=12) # 小于12
models.PrettyNum.objects.filter(id__lte=12) # 小于等于12
data_dict = {"id__lte":12}
models.PrettyNum.objects.filter(**data_dict)
models.PrettyNum.objects.filter(mobile="999") # 等于
models.PrettyNum.objects.filter(mobile__startswith="1999") # 筛选出以1999开头
models.PrettyNum.objects.filter(mobile__endswith="999") # 筛选出以999结尾
models.PrettyNum.objects.filter(mobile__contains="999") # 筛选出包含999
## 分页
queryset = models.PrettyNum.objects.all()[0:10] # 第1页
queryset = models.PrettyNum.objects.all()[10:20] # 第2页
Form & ModelForm
Form
class MyForm(Form):
user = forms.CharField(widget=forms.Input)
pwd = form.CharFiled(widget=forms.Input)
email = form.CharFiled(widget=forms.Input)
account = form.CharFiled(widget=forms.Input)
create_time = form.CharFiled(widget=forms.Input)
depart = form.CharFiled(widget=forms.Input)
gender = form.CharFiled(widget=forms.Input)
def user_add(request):
if request.method == "GET":
form = MyForm()
return render(request, 'user_add.html',{"form":form})
生成表单
<form method="post"> {% for field in form%} <!-- 遍历 --> {{ field }} {% endfor %} <!-- <input type="text" placeholder="姓名" name="user" /> --> <!-- 单个 --> </form>
ModelForm
- 校验数据
class MyForm(ModelForm):
xx = form.CharField*("...") ## 单独配置某字段的校验
class Meta: ## 批量配置
model = UserInfo
fields = ["name","password","age","xx"]
def user_add(request):
if request.method == "GET":
form = MyForm()
return render(request, 'user_add.html',{"form":form})
