10-手机号列表

1. 数据库新建库-app[models.py]
# 表结构: mobile-price-level(choice)-status(1:未占用2:已占用)
class PrettyNum(models.Model):
    '''手机号表'''
    mobile = models.CharField(verbose_name="手机号", max_length=11)
    # 想要允许为空,null=True,blank=True
    price = models.IntegerField(verbose_name="价格", default=0)

    level_choices = (
        (1, "1级"),
        (2, "2级"),
        (3, "3级"),
        (4, "4级"),
    )
    level = models.SmallIntegerField(verbose_name="级别", choices=level_choices, default=1)  # default=1:默认1

    status_choices = (
        (1, "已占用"),
        (2, "未占用"),
    )
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=2)

2. 执行命令生成数据库表
# 在mysql中生成表
    '''
    1. 工具连接mysql生成数据库 
        create database 库名 default charset utf8 collate utf8_general_ci;
    
    2. django 中修改配置文件,连接Mysql
    
    3. django命令生成数据库表
        python manage.py makemigrations
        python manage.py migrate
    '''
#####3.. 创建视图函数: app[view][phone.py]
```python
from django.shortcuts import render, redirect
# Create your views here.
from app01 import models

from app01.utils.form import PrettyModelForm, PrettyUpdateModelForm


#########手机号管理#########

def phone_list(request):
    """列表"""
    data_dict = {}
    search_data = request.GET.get("q", "")  # 有值的话拿值,没值空字符串
    # print("====",search_data)
    if search_data:
        data_dict["mobile__contains"] = search_data  # mobile__contains: 手机号__模糊搜索

    from app01.utils.pagemtion import Pagination  # 导入分页

    # select * from 表 order by level desc;  django里直接输入表字段正序; -字段:倒叙;
    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")

    page_object = Pagination(request, queryset)

    context = {
        "search_data": search_data,

        "phone": page_object.page_queryset,  # 分完页的所有数据
        "page_string": page_object.html()  # 页码
    }

    return render(request, "phone_list.html", context)


def phone_add(request):
    if request.method == "GET":
        """新增"""
        form = PrettyModelForm()
        return render(request, "phone_add.html", {"form": form})

    form = PrettyModelForm(data=request.POST)
    if form.is_valid():
        form.save()
        return redirect("/phone/list/")

    return render(request, "phone_add.html", {"form": form})


def phone_update(request, nid):
    """更新用户"""
    row_object = models.PrettyNum.objects.filter(id=nid).first()
    if request.method == "GET":
        form = PrettyUpdateModelForm(instance=row_object)

        return render(request, "phone_update.html", {"form": form})

    form = PrettyUpdateModelForm(data=request.POST, instance=row_object)  # 获取数据

    if form.is_valid():
        form.save()
        return redirect("/phone/list/")

    return render(request, "phone_update.html", {"form": form})


def phone_delete(request, nid):
    '''删除靓号'''
    models.PrettyNum.objects.filter(id=nid).delete()
    return redirect("/phone/list/")

4. 创建form.py继承modelform: app[util][form.py]
from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from django import forms
#########modelsForm#######
class PrettyModelForm(BootStrapModelForm):
    # 进行格式的校验: 第一种: 字段+正则
    from django.core.validators import RegexValidator
    mobile = forms.CharField(
        label="手机号",
        validators=[RegexValidator(r'1[3-9]\d{9}$', '手机号格式错误'), ],  # 使用正则效验,不符合提示错误信息
    )

    class Meta:
        model = models.PrettyNum
        fields = ["mobile", "price", "level", "status"]
        # fields = "__all__"  # 所有字段
        # exclude = ["level"]  # 排除那个字段

    # 校验: 第二种:钩子方法, clean_字段名
    def clean_mobile(self):
        from django.core.validators import ValidationError
        txt = self.cleaned_data["mobile"]  # self.cleaned_data["字段"]:获取用户传入的数据
        exists = models.PrettyNum.objects.filter(mobile=txt).exists()  # 判断用户输入的手机号是否已存在
        # 验证不通过,抛给前端一个异常
        if exists:
            raise ValidationError("手机号已存在")  # 返回前端异常信息

        # 验证通过,把用户输入的值返回
        return txt


#####编辑的modelform####3
class PrettyUpdateModelForm(BootStrapModelForm):
    # mobile = forms.CharField(disabled=True, label="手机号")  # 设置不可更改
    from django.core.validators import RegexValidator
    mobile = forms.CharField(
        label="手机号",
        validators=[RegexValidator(r'1[3-9]\d{9}$', '手机号格式错误'), ],
    )

    class Meta:
        model = models.PrettyNum
        fields = ["mobile", "price", "level", "status"]  # 只显示里面有的数据

    # 校验: 第二种:钩子方法, clean_字段名
    def clean_mobile(self):
        from django.core.validators import ValidationError

        # 当前编辑的那一行ID
        # print(self.instance.pk)  # 固定语法:instance:对象;pk:id

        txt = self.cleaned_data["mobile"]  # 获取用户传入的数据
        exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt).exists()  # 判断用户输入的手机号是否已存在
        # 验证不通过,抛给前端一个异常
        if exists:
            raise ValidationError("手机号已jing存在")  # 返回前端异常信息

        # 验证通过,把用户输入的值返回
        return txt

5. 创建url,项目[url.py]
# 靓号管理
    path('phone/list/', pretty.phone_list),
    path('phone/add/', pretty.phone_add),
    path('phone/<int:nid>/update/', pretty.phone_update),
    path('phone/<int:nid>/delete/', pretty.phone_delete),
6. 创建列表html,app[templates][phone_list.html]
{% extends 'one.html'%}

{% block content %}
<div class="container">
    <div style="margin-bottom:10px;" class="clearfix">
        <a class="btn btn-success" href="/phone/add/">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
            新建手机号</a>

        <div style="float:right;width:300px;">
            <form method="get">
                <div class="input-group">

                    <input type="text" name="q" class="form-control" placeholder="Search for..."
                           value="{{ search_data }}">
                    <span class="input-group-btn">
                    <button class="btn btn-default" type="submit">
                        <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                    </button>
                  </span>

                </div>
            </form>
        </div>

        <a class="btn btn-success" href="/phone/add/">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
            新建手机号ModelForm</a>
    </div>

    <div class="panel panel-default">
        <!-- Default panel contents -->
        <div class="panel-heading">
            <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
            用户列表
        </div>

        <!-- Table -->
        <table class="table table-bordered">
            <thead>
            <tr>
                <th>ID</th>
                <th>手机号</th>
                <th>价格</th>
                <th>级别</th>
                <th>状态</th>
            </tr>
            </thead>
            <tbody>
            {% for obj in phone %}
            <tr>
                <th>{{ obj.id }}</th>
                <th>{{ obj.mobile }}</th>
                <th>{{ obj.price }}</th>
                <!--                {{ obj.get_表字段_display }}获取定义的限制文字  -->
                <td>{{ obj.get_level_display }}</td>
                <td>{{ obj.get_status_display }}</td>

                <td>
                    <a class="btn btn-primary btn-xs" href="/phone/{{ obj.id }}/update">编辑</a>
                    <a class="btn btn-danger btn-xs" href="/phone/{{ obj.id }}/delete">删除</a>
                </td>
            </tr>
            {% endfor %}

            </tbody>
        </table>
    </div>
    <div class="clearfix">
    <ul class="pagination">
        {{ page_string }}

    </ul>
    </div>


</div>

{% endblock %}

7. 创建添加html,app[templates][phone_add.html]
{% extends 'one.html' %}

{% block content %}

<div class="container">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h3 class="panel-title">新建靓号</h3>
        </div>
        <div class="panel-body">
            <!--            novalidate: 关掉浏览器的校验-->
            <form method="post" novalidate>
                {% csrf_token %}

                {% for field in form %}
                <div class="form-group">
                    <label>{{ field.label }}</label>
                    <!--                    <input type="text" class="form-control" placeholder="姓名" name="user">-->
                    {{ field }}
                    <span style="color:red;"> {{ field.errors.0 }}</span>
                </div>
                {% endfor %}

                <button type="submit" class="btn btn-primary">提 交</button>
            </form>
        </div>
    </div>
</div>

{% endblock %}


8. 创建修改html,app[templates][phone_update.html]
{% extends 'one.html' %}

{% block content %}
<div class="container">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h3 class="panel-title">编辑用户</h3>
        </div>
        <div class="panel-body">
<!--            novalidate: 关掉浏览器的校验-->
            <form method="post" novalidate>
                {% csrf_token %}

                {% for field in form %}
                <div class="form-group">
                    <label>{{ field.label }}</label>
<!--                    <input type="text" class="form-control" placeholder="姓名" name="user">-->
                    {{ field }}
                    <span style="color:red;">
                    {{ field.errors.0 }}
                        </span>
                </div>
                {% endfor %}

                <button type="submit" class="btn btn-primary">提 交</button>
            </form>
        </div>
    </div>
</div>


{% endblock %}
posted @ 2022-12-07 16:14  测试圈的彭于晏  阅读(91)  评论(0)    收藏  举报