赞
踩
-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起别名做反向解析
- # 反向解析前端<a href="{% url 'xxx' %}?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
- # 反向解析后端 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) # <QueryDict: {'username': ['zero'], 'password': ['123']}>
- 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 %} # 静态文件动态解析
- <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
- <h1 class="text-center">登录功能</h1>
- <div class="container">
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <form action="" method="post">
- <p>username:<input type="text" name="username" class="form-control"></p>
- <p>password:<input type="password" name="password" class="form-control"></p>
- <input type="submit" class="btn btn-success btn-block">
- </form>
- </div>
- </div>
- </div>
- <h1 class="text-center">注册功能</h1>
- <div class="container">
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <form action="" method="post">
- <p>username:<input type="text" name="username" class="form-control"></p>
- <p>password:<input type="password" name="password" class="form-control"></p>
- <input type="submit" class="btn btn-danger btn-block">
- </form>
- </div>
- </div>
- </div>
- <h1 class="text-center">数据展示</h1>
- <div class="container">
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>ID</th>
- <th>username</th>
- <th>password</th>
- <th>action</th>
- </tr>
- </thead>
- <tbody>
- {% for user_obj in user_queryset %}
- <tr>
- <td>{{ user_obj.id }}</td>
- <td>{{ user_obj.username }}</td>
- <td>{{ user_obj.password }}</td>
- <td>
- <a href="{% url 'xxx' %}?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
- <a href="/delete_user/?user_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <h1 class="text-center">编辑功能</h1>
- <div class="container">
- <div class="row">
- <div class="col-md-8 col-md-offset-2">
- <form action="" method="post">
- <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.username }}"></p>
- <p>password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
- <input type="submit" class="btn btn-info btn-block" value="编辑">
- </form>
- </div>
- </div>
- </div>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。