Django学习 day57之Django第四日

一 django连接mysql

  1. 如果项目使用sqlite,不需要额外配置,直接操作即可

  2. 代码声明
    django默认用的是mysqldb模块链接MySQL
    但是该模块的兼容性不好 需要手动改为用`pymysql链接

    你需要告诉django不要用默认的mysqldb还是用pymysql
    在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以

    import pymysql
    	pymysql.install_as_MySQLdb()
    
  3. showmigrations:查看哪些记录更改了,但是没有同步到数据库中

  4. 如果使用mysql,需要配置如下:

    1. 配置文件中配置:settings.py
    	DATABASES = {
          
          
        'default': {
          
          
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day62',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD':'123'
            }
        }
    
    1. 需要在 app的__init__.py 中写,为了pymsql的替换,上面讲过
      import pymysql
      pymysql.install_as_MySQLdb()

    2. 后续操作完全一样,在models中建立类,写字段

    3. 视图函数中插入,查询

    4. pycharm的–》tools—》run manage.py Task

二 路由层之简单路由配置

  1. 路由参数

    1. 第一个参数是正则表达式
    2. 第二个参数是视图函数内存地址
    3. 第三个参数是个字典 {‘name’:lqz,‘age’:18},给视图函数传递默认值
    4. 第四个参数name,当前路由的别名,用作反向解析
      url(r'^home2/', views.home,{'name':'lqz','age':19},name='home'),
  2. 访问根路径,触发视图函数执行(路由怎么配)
    url(r'^$', admin.site.urls),

  3. 在路由中配置多个相同路由会怎么样?
    只会执行第一个

  4. 如下路由会怎么样?永远不会匹配到第二个
    url(r'^login', views.home),
    url(r'^login2', views.home),

三 数据库迁移命令


python3 manage.py makemigrations 将操作记录记录到小本本上(migrations文件夹)

python3 manage.py migrate 将操作真正的同步到数据库中
只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令


class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True,verbose_name='主键')
    # username varchar(32)
    username = models.CharField(max_length=32,verbose_name='用户名')
    """
    CharField必须要指定max_length参数 不指定会直接报错
    verbose_name该参数是所有字段都有的 就是用来对字段的解释
    """
    # password int
    password = models.IntegerField(verbose_name='密码')


class Author(models.Model):
    # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
    # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
    # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写
    # username varchar(32)
    username = models.CharField(max_length=32)
    # password int
    password = models.IntegerField()

四 给html传值的两种方式

view.py

def ab_render(request):
    # 视图函数必须要接受一个形参request
    user_dict = {
    
    'username':'jason','age':18}
    # 第一种传值方式:更加的精确 节省资源
    # return render(request,'01 ab_render.html',{'data':user_dict,'date':123})
    # 第二种传值方式:当你要传的数据特别多的时候
    """locals会将所在的名称空间中所有的名字全部传递给html页面"""
    return render(request,'01 ab_render.html',locals())
	
return redirect(url)

五 字段的增删改查

字段的增加

  1. 可以在终端内直接给出默认值
  2. 该字段可以为空
    info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
  3. 直接给字段设置默认值
    hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')

字段的修改

直接修改代码然后执行数据库迁移的两条命令即可!

字段的删除

直接注释对应的字段然后执行数据库迁移的两条命令即可!

执行完毕之后字段对应的数据也都没有了

注意出错:
在操作models.py的时候一定要细心
千万不要注释一些字段
执行迁移命令之前最好先检查一下自己写的代码

顶级建议: 当你离开你的计算机之后一定要锁屏

六 数据的增删改查

方式1
    data = models.User.objects.filter()
方式2
    user_queryset = models.User.objects.all()

返回值是类似列表套数据对象的格式

  • 它也支持索引取值 切片操作 但是不支持负数索引
  • 它也不推荐你使用索引的方式取值
    推荐取值方式:user_obj = models.User.objects.filter(username=username).first()

filter括号内可以携带多个参数 参数与参数之间默认是and关系
你可以把filter联想成where记忆

第一种方法

from app01 import models
res = models.User.objects.create(username=username,password=password)
  • 返回值就是当前被创建的对象本身

第二种方法

user_obj = models.User(username=username,password=password)
user_obj.save()  # 保存数据

修改数据方式1

models.User.objects.filter(id=edit_id).update(username=username,password=password)
"""
将filter查询出来的列表中所有的对象全部更新       批量更新操作
只修改被修改的字段
"""

修改数据方式2,了解即可,不会用的

edit_obj.username = username
edit_obj.password= password
edit_obj.save()
"""
上述方法当字段特别多的时候效率会非常的低
从头到尾将数据的所有字段全部更新一遍 无论该字段是否被修改
"""

跟编辑功能逻辑类似

# 在数据库中找到对应的数据删除
models.User.objects.filter(id=delete_id).delete()
# 批量删除
  • 然而真正的删除功能应该需要二次确认 我们这里先不做后面会讲
  • 大部分公司的删除数据,内部其实并不是真正的删除,我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是将字段修改一个状态
username password	is_delete
jason		123			0
egon		123			1

查改删综合案例

userlist.html 以列表形式循环打印用户信息,并且每列信息后有编辑删除按钮

{% 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="/edit_user/?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 %}

edit_user.html 编辑数据窗口

<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>

视图函数:展示用户

def userlist(request):
    # 查询出用户表里面所有的数据
    # 方式1
    # data = models.User.objects.filter()
    # print(data)
    # 方式2
    user_queryset = models.User.objects.all()
    # return render(request,'userlist.html',{'user_queryset':user_queryset})
    return render(request,'userlist.html',locals())

视图函数:编辑功能

# 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
def edit_user(request):
  # 获取url问号后面的参数,也就是选择的id
  edit_id = request.GET.get('user_id')
  # 查询当前用户想要编辑的数据对象,通过id从orm找到用户对象
  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)
      # 跳转到数据的展示页面
      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/')	

猜你喜欢

转载自blog.csdn.net/wuzeipero/article/details/108892289
今日推荐