-mysite项目文件夹
--mysite文件夹
---settings.py 配置文件
---urls.py 路由与视图函数对应关系(路由层)
---wsgi.py wsgiref模块
--manage.py django的入口文件
--db.sqlite3 django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
--templates html文件存放文件夹
--static 存放静态文件
---css
---js
---img
其他第三方文件
--app01文件夹
---admin.py django后台管理
---apps.py 注册使用
---migrations文件夹 数据库迁移记录
---models.py 数据库相关的 模型类(orm)
---tests.py 测试文件
---views.py 视图函数(视图层)
INSTALLED_APPS # 注册的app
MIDDLEWARE # django中间件
TEMPLATES # html文件存放路径配置
DATABASES # 项目指定的数据库
LANGUAGE_CODE = 'en-us' # 文字编码
TIME_ZONE = 'UTC' # 时间
APPEND_SLASH = False # 取消url自动加斜杠 默认是True
STATIC_URL = 'static/' # 类似于访问静态文件的令牌
"""如果你想要访问静态文件 你就必须以static开头"""
STATICFILES_DIRS = [ # 静态文件配置
os.path.join(BASE_DIR, "static"),
]
# django链接MySQL
# 1.配置文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'data',
'USER': 'root',
'PASSWORD': '123123',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
# 2.在项目名下的init或任意的应用名下的init文件中书写以下代码即可
import pymysql
pymysql.install_as_MySQLdb()
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index), # 路由匹配
path('login/', views.login), # 登录功能
path('register/', views.reg), # 注册功能
path('userlist/', views.userlist), # 展示用户列表
path('edit_user/', views.edit_user, name='xxx'), # 编辑用户 name起别名做反向解析
# 反向解析前端编辑
# 反向解析后端 from django.shortcuts import reverse reverse('xxx')
path('delete_user/', views.delete_user), # 删除用户
]
from django.shortcuts import render, HttpResponse, redirect
def index(request):
# django小白必会三板斧(render, HttpResponse, redirect)
# return HttpResponse("hello world") # 返回字符串类型的数据
# return render(request, 'index.html') # 返回html文件 自动去templates文件夹下查找文件
# return redirect('https://www.baidu.com') # 跳转别人的网址
# return redirect('/login') # 跳转自己的网址
# 模板语法
user_dict = {'username': 'zhangsan', 'age': 100}
# 第一种传值方式:更加的精确 节省资源
# return render(request, 'index.html', {'user_dict': user_dict})
# 第二种传值方式:当你要传的数据特别多的时候
"""locals会将所有在名称空间所有的名字全部传递给html页面"""
return render(request, 'index.html', locals())
def login(request):
return HttpResponse('login')
# request对象方法:
request.method # 返回请求方式 并且是全大写的字符串形式
request.POST # 获取用户提交的post请求数据(不包含文件) < QueryDict: {'username': ['zs'], 'password': ['123']} >
request.POST.get() # 只获取列表最后一个元素
request.POST.getlist() # 直接将列表取出
request.GET # 获取用户提交的get请求数据 get请求携带的数据的大小限制4kb左右而post请求则没有限制
request.GET.get() # 只获取列表最后一个元素
request.GET.getlist() # 直接将列表取出
request.FILES # 获取文件数据
request.path # /login/
request.path_info # /login/
request.get_full_path() # /login/?username=zhangsan/
# models操作数据库
models.User.objects.create(username=username, password=password) # 增
models.User.objects.filter(id=delete_id).delete() # 删
models.User.objects.filter(id=edit_id).update(username=username, password=password) # 改
user_queryset = models.User.objects.all() # 查
app01 import models
def login(request):
if request.method == 'POST':
# 获取用户提交的数据
username = request.POST.get('username')
password = request.POST.get('password')
# 查询数据库数据
user_obj = models.User.objects.filter(username=username).first() # select * from user where username='zero';
# print(user_obj) #
if user_obj:
if password == user_obj.password:
return HttpResponse("登录成功")
else:
return HttpResponse("密码错误")
else:
return HttpResponse("用户不存在")
return render(request, 'login.html')
def reg(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 第一种方法:数据库的增加
# 直接获取用户数据存入数据库
# res = models.User.objects.create(username=username, password=password)
# print(res, res.username, res.password)
# 第二种方法:数据库的增加
user_obj = models.User(username=username, password=password)
user_obj.save() # 保存数据
return render(request, 'reg.html')
def userlist(request):
# 查询出用户表里面的所有数据
# 方式一
# data = models.User.objects.filter() # select * from user
# print(data)
# 方式二
user_queryset = models.User.objects.all()
return render(request, 'userlist.html', locals())
def edit_user(request):
# 获取url问号后面的参数
edit_id = request.GET.get('user_id')
# 查询当前用户想要编辑的数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 去数据库中修改对应的内容
# 修改数据方式一
models.User.objects.filter(id=edit_id).update(username=username, password=password)
# 修改数据方式二
# edit_obj.username = username
# edit_obj.password = password
# edit_obj.save()
# 跳转到数据的展示页面
return redirect('/userlist/')
# 将数据对象展示到页面上
return render(request, 'edit_user.html', locals())
def delete_user(request):
# 获取用户想要删除的数据id值
delete_id = request.GET.get('user_id')
# 直接去数据库中找到对应的数据删除即可
models.User.objects.filter(id=delete_id).delete()
return redirect('/userlist/')
"""
ROM:对象关系映射
作用:通过pythom面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高 有时候sql语句的效率偏低 需要自己写SQL语句
数据库迁移命令:
python manage.py makemigrations
python manage.py migrate
创建项目命令:startapp app02
"""
from django.db import models
class User(models.Model):
"""
创建模型表的时候如果主键字段名没有额外的叫法(默认id) 那么主键字段可以省略不写
max_length:字段长度
verbose_name:用来对字段的解释
null=True:该字段可以为空
default=18:默认值
"""
username = models.CharField(max_length=32, verbose_name='用户名') # username varchar(32)
# password = models.IntegerField() # password int
# 字段的修改
password = models.CharField(max_length=32) # password int
# 字段的增加
age = models.IntegerField(default=18)
# 创建表关系
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 一对多 默认就是与Publish表的主键字段做外键关联 on_delete=models.CASCADE级联删除
authors = models.ManyToManyField(to='Author') # 多对多 ManyToManyField会自动创建第三张表
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE) # 一对一
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
{{ user_dict }} # 模板语法
{% load static %} # 静态文件动态解析
登录功能
注册功能
数据展示
编辑功能