自动化测试平台搭建系列(12)——Django框架中的模型(model)及用户的登录注册(上篇)

文章目录


练习源码(gitee):
https://gitee.com/yinjiangbing/django_study_model.git
前面了解了一下模板的使用和一些概念,下面就开始认识一下模型了
看下Django对模型的定义:
模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
模型类的每个属性都相当于一个数据库表的字段。
利用这些,Django 提供了一个自动生成访问数据库的 API
可以参考Django官网说明: Django官网说明
在这里插入图片描述
下面还是举实际例子吧。。。
在users下有一个models.py,也就是用户类的模型,这个是创建APP的时候就带着的,不用自己创建
在这里插入图片描述
接下来创建一个user类,然后让它去继承models.Model

class User(models.Model)

然后就市区创建它的字段,比如它有id,username、password、add_time
看下如何去创建id这个字段
username的创建为例:

username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})

CharField可以点进去查看它的底层代码,它是一个类,返回一个Filed
其中max_length代表这个字段的最大长度(必须要有这个值)
unique:是否唯一,True代表唯一
null=False:表示不允许为空
error_messages:错误信息(键值对出现)

class User(models.Model):
    username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})
    password = models.CharField(max_length=100, null=False)
    phone = models.CharField(max_length=11)
    # 注意:时间用的是DateTimeField
    add_time = models.DateTimeField(default=datetime.now)

然后去返回一个想要的东西
我这里只返回了一个username,还可以返回去他的或者拼接

    def __str__(self):
        return self.username

下面还需要定义一个内部类Meta,这个内部类指定的是一个表名
默认表名是user,也可以自己指定表名(db_table=‘表名’)
这样我就把我的表名改成了userprofile

    class Meta:
        db_table = 'userprofile'

这就定义了一个简单的模型类(前提是不要忘记配置settings.py里的数据库)

from datetime import datetime

from django.db import models


# Create your models here.

class User(models.Model):
    username = models.CharField(max_length=12, unique=True, null=False, error_messages={'unique': '用户名必须唯一'})
    password = models.CharField(max_length=100, null=False)
    phone = models.CharField(max_length=11)
    add_time = models.DateTimeField(default=datetime.now)

    def __str__(self):
        return self.username

    class Meta:
        db_table = 'userprofile'

接下来要做的就是迁移同步,把数据同步到数据库里
命令:

# 迁移,这里只是把配置同步到了users下的makemigrations里面了,只是生成一个文件,还没同步到数据库
python manage.py makemigrations
# 同步,同步到数据库
python manage.py migrate

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
id是自动生成的
如果想改表名只要改db_table就行
再把表名改成user

class Meta:
      db_table = 'user'

然后依次执行命令即可

python manage.py makemigrations

python manage.py migrate

在这里插入图片描述
在这里插入图片描述
添加表格字段也是这样操作
在这里插入图片描述
那接下来就把注册登录写进数据库
修改之前的register和login
在template下创建一个用户模型(user文件包)
将register和login放进去
base就直接放在template下了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
下面通过例子来看下数据类型,
在这里插入图片描述
choices可选项:
在这里插入图片描述

先以商城的一个商品为例
我之前还创建了一个商品APP(goods),就直接把它拿过来用
在这里插入图片描述
然后同样在models.py里去编辑商品模型
然后去定义这个商品的名字,简介,价格,重量,数量,增值业务等

class Goods(models.Model):
    name = models.CharField(max_length=100, null=False)
    desc = models.CharField(max_length=300)
    # 价格,保留小数点后2位
    price = models.DecimalField(max_digits=6, decimal_places=2, null=False)
    wight = models.DecimalField(max_digits=6, decimal_places=2)
    store_num = models.IntegerField(default=100)
    value_added = models.CharField(max_length=100, choices=(('frist', '业务1')('two', '业务2')))

在这里插入图片描述

在这里插入图片描述
数据库的添加有两种方法:
方法一:

user = User()
user.username = username
# user.password = password
# 对密码进行加密
user.password = hashlib.sha256(password.encode('utf-8')).hexdigest()
if phone:
    user.phone = phone
user.save()
return HttpResponse('用户注册成功!')

方法二:

password = hashlib.sha256(password.encode('utf-8')).hexdigest()
user = User.objects.create(username=username, password=password, phone=phone)
if user:
    return HttpResponse('用户注册成功!')

接下看下登录(数据库的查询):
在视图里创建登录函数,然后添加路由

# 用户登录
def login(request):
    # post请求时需要做的处理
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 判断输入的用户是否存在
        if username and password:
            # 查询(注意:密码是加密的,用户名是唯一的,可以根据用户名查询)
            user = User.objects.filter(username=username).first()
            password = hashlib.sha256(password.encode('utf-8')).hexdigest()
            # 如果用户存在的情况下执行下面的动作
            if user:
                if user.password == password:
                    return HttpResponse('用户登录成功!')

            return render(request, 'user/login.html', {'msg': '用户名或者密码有误!'})
        else:
            return render(request, 'user/login.html', {'msg': '用户名或者密码不能为空!'})
    return render(request, 'user/login.html')

这里查询可以使用filter()来查询,照例看下filter()的底层来做下了解:

    def filter(self, *args, **kwargs):
        """
        Return a new QuerySet instance with the args ANDed to the existing
        set.
        """
        self._not_support_combined_queries('filter')
        return self._filter_or_exclude(False, args, kwargs)

可以看到它是返回一个new QuerySet(查询集),所以需要传参来获取指定值

User.objects.filter(username=username)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就实现了我的用户登录了
接下来看下如何实现登陆后显示我的登录信息
先创建一个show.html
在这里插入图片描述

{% extends 'base.html' %}
{% block title %}
    所用用户
{% endblock %}

{% block mycss %}
    <style>
    #error{
        color: red;
    }
    </style>
{% endblock %}
{% block content %}
    <table class="table table-hover">
        <tr>
            <td>序号</td>
            <td>用户名</td>
            <td>手机号码</td>
            <td>注册时间</td>
            <td>操作</td>
        </tr>

        {% for user in users %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ user.username }}</td>
                <td>{{ user.phone | default:'未注册' }}</td>
                <td>{{ user.add_time }}</td>
                <td>
                    <a href="">删除</a>
                    <a href="">修改</a>
                </td>
            </tr>
        {% endfor %}
    </table>
{% endblock %}

在这里插入图片描述

然后在视图里添加show函数,添加路由

# 展示页
def show(request):
    # show需要查询所有的
    users = User.objects.all()
    return render(request, 'user/show.html', {'users': users})

show需要查询所有,这里有到了all()

User.objects.all()

这里想实现登陆成功后直接跳转到show页面,需要对login函数进行一下修改
在这里插入图片描述
运行结果:
在这里插入图片描述
样式可以自行改一下!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七光年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值