1. 数据库新建库-app[models.py]
| class User(models.Model): |
| """员工表""" |
| |
| name = models.CharField(verbose_name="员工姓名", max_length=32) |
| password = models.CharField(verbose_name="密码", max_length=64) |
| age = models.IntegerField(verbose_name="年龄") |
| account = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2) |
| create_time = models.DateTimeField(verbose_name="入职时间") |
| depart = models.ForeignKey(verbose_name="部门", to="Depart", to_field="id", on_delete=models.CASCADE) |
| |
| gender_choices = ( |
| (1, "男"), |
| (0, "女"), |
| ) |
| gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices) |
| |
2. 执行命令生成数据库表
| |
| ''' |
| 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[util][pagemtion.py]
| """ |
| 自定义的分页组件,以后想要使用分页组件需要做如下几件事: |
| |
| 在试图函数中 |
| def phone_list(request): |
| |
| # 1. 根据自己的情况筛选数据 |
| queryset = models.PrettyNum.objects.all() |
| |
| # 2.实例化分页对象 |
| page_object = Pagination(request, queryset) |
| |
| context = { |
| "phone": page_object.page_queryset, # 分完页的数据 |
| "page_string": page_object.html() # 页码 |
| } |
| |
| return render(request, "phone_list.html", context) |
| |
| 在html页面中: |
| <ul class="pagination"> |
| {{ page_string }} |
| </ul> |
| """ |
| |
| |
| class Pagination(object): |
| def __init__(self, request, queryset, page_size=10, page_pram="page", plus=5): |
| """ |
| reuqest: 请求的对象 |
| queryset: 符合条件的数据(根据这个数据进行分页处理) |
| page_size:每页显示多少条数据 |
| page_pram: 在url中传递的获取分页的参数,例如: /phone/list?page=12 |
| plus: 显示当前页的,前后几页(页码) |
| """ |
| from django.http.request import QueryDict |
| import copy |
| querty_dict = copy.deepcopy(request.GET) |
| |
| |
| querty_dict._mutable = True |
| self.querty_dict = querty_dict |
| self.page_pram = page_pram |
| |
| |
| page = request.GET.get(page_pram, "1") |
| if page.isdecimal(): |
| page = int(page) |
| else: |
| page = 1 |
| self.page = page |
| self.page_size = page_size |
| |
| |
| self.start = (page - 1) * page_size |
| self.end = page * page_size |
| |
| |
| self.page_queryset = queryset[self.start:self.end] |
| |
| |
| phone_count = queryset.count() |
| |
| phone_page_count, div = divmod(phone_count, page_size) |
| if div: |
| phone_page_count += 1 |
| self.phone_page_count = phone_page_count |
| |
| self.plus = plus |
| |
| def html(self): |
| |
| if self.phone_page_count <= 2 * self.plus + 1: |
| |
| start_page = 1 |
| end_page = self.phone_page_count |
| else: |
| |
| |
| if self.page <= self.plus: |
| start_page = 1 |
| end_page = 2 * self.plus + 1 |
| else: |
| |
| |
| if self.page + self.plus > self.phone_page_count: |
| start_page = self.phone_page_count - 2 * self.plus |
| end_page = self.phone_page_count |
| else: |
| start_page = self.page - self.plus |
| end_page = self.page + self.plus |
| |
| |
| from django.utils.safestring import mark_safe |
| page_str_list = [] |
| |
| self.querty_dict.setlist(self.page_pram, [1]) |
| |
| |
| |
| page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.querty_dict.urlencode())) |
| |
| |
| |
| |
| if self.page > 1: |
| self.querty_dict.setlist(self.page_pram, [self.page - 1]) |
| prev = '<li><a href="?{}">上一页</a></li>'.format(self.querty_dict.urlencode()) |
| else: |
| self.querty_dict.setlist(self.page_pram, [1]) |
| prev = '<li><a href="?page={}">上一页</a></li>'.format(self.querty_dict.urlencode()) |
| page_str_list.append(prev) |
| |
| |
| for i in range(start_page, end_page + 1): |
| self.querty_dict.setlist(self.page_pram, [i]) |
| |
| if i == self.page: |
| ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.querty_dict.urlencode(), i) |
| else: |
| ele = '<li><a href="?{}">{}</a></li>'.format(self.querty_dict.urlencode(), i) |
| page_str_list.append(ele) |
| |
| |
| |
| if self.page < self.phone_page_count: |
| self.querty_dict.setlist(self.page_pram, [self.page + 1]) |
| prev = '<li><a href="?{}">下一页</a></li>'.format(self.querty_dict.urlencode()) |
| else: |
| self.querty_dict.setlist(self.page_pram, [self.phone_page_count]) |
| |
| prev = '<li><a href="?{}">下一页</a></li>'.format(self.querty_dict.urlencode()) |
| page_str_list.append(prev) |
| |
| |
| self.querty_dict.setlist(self.page_pram, [self.phone_page_count]) |
| |
| page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.querty_dict.urlencode())) |
| |
| |
| search_string = """ |
| <li> |
| <form style="float:left; margin-left:-1px;" method="get"> |
| <input name=page |
| style="position:relative;float:left;display:inline-block;width:80px;border-radius:0" |
| type="text" class="form-control" placeholder="页码"> |
| <button style="border-radius:0" class="btn btn-default type=submit">跳转</button> |
| </form> |
| </li> |
| """ |
| page_str_list.append(search_string) |
| |
| page_string = mark_safe("".join(page_str_list)) |
| return page_string |
| |
4. 创建视图函数: app[view][user.py]
| from django.shortcuts import render, redirect |
| |
| from app01 import models |
| |
| from app01.utils.form import UserModelForm |
| |
| |
| |
| def user_list(request): |
| """用户表""" |
| |
| queryset = models.User.objects.all() |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| from app01.utils.pagemtion import Pagination |
| page_object = Pagination(request, queryset, page_size=2) |
| context = { |
| "querty": page_object.page_queryset, |
| "page_string": page_object.html() |
| } |
| |
| return render(request, "user_list.html", context) |
| |
| |
| def user_add(request): |
| if request.method == "GET": |
| '''添加用户''' |
| context = { |
| 'gender_choices': models.User.gender_choices, |
| 'depart_list': models.Depart.objects.all() |
| } |
| |
| return render(request, 'user_add.html', context) |
| |
| user = request.POST.get("user") |
| pwd = request.POST.get("pwd") |
| age = request.POST.get("age") |
| account = request.POST.get("ac") |
| ctime = request.POST.get("ctime") |
| gender = request.POST.get("gd") |
| depart_id = request.POST.get("dp") |
| |
| |
| models.User.objects.create(name=user, password=pwd, age=age, |
| account=account, create_time=ctime, |
| gender=gender, depart_id=depart_id) |
| |
| |
| return redirect("/user/list/") |
| |
| |
| def user_model_form_add(request): |
| """添加用户""" |
| if request.method == "GET": |
| form = UserModelForm() |
| |
| return render(request, "model_form_add.html", {"form": form}) |
| |
| form = UserModelForm(data=request.POST) |
| |
| if form.is_valid(): |
| |
| |
| |
| form.save() |
| return redirect("/user/list/") |
| |
| |
| return render(request, 'model_form_add.html', {"form": form}) |
| |
| |
| def user_update(request, nid): |
| """更新用户""" |
| row_object = models.User.objects.filter(id=nid).first() |
| |
| |
| |
| if request.method == "GET": |
| form = UserModelForm(instance=row_object) |
| |
| return render(request, "user_update.html", {"form": form}) |
| |
| form = UserModelForm(data=request.POST, instance=row_object) |
| |
| if form.is_valid(): |
| form.save() |
| return redirect("/user/list/") |
| |
| return render(request, "user_update.html", {"form": form}) |
| |
| |
| def user_delete(request, nid): |
| '''删除用户''' |
| models.User.objects.filter(id=nid).delete() |
| return redirect("/user/list/") |
| |
5. 绑定url,项目[url.py]
| |
| path('user/list/', user.user_list), |
| path('user/add/', user.user_add), |
| path('user/model/add/', user.user_model_form_add), |
| path('user/<int:nid>/update/', user.user_update), |
| path('user/<int:nid>/delete/', user.user_delete), |
5. 编写列表html,app[templates][user_list.html]
| {% extends 'one.html' %} |
| |
| |
| {% block content %} |
| <div class="container"> |
| <div style="margin-bottom:10px;"> |
| <a class="btn btn-success" href="/user/add/"> |
| <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> |
| 新建用户</a> |
| |
| <a class="btn btn-success" href="/user/model/add/"> |
| <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> |
| 新建用户ModelForm</a> |
| </div> |
| |
| <div class="panel panel-default"> |
| |
| <div class="panel-heading"> |
| <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> |
| 用户列表 |
| </div> |
| |
| |
| <table class="table table-bordered"> |
| <thead> |
| <tr> |
| <th>ID</th> |
| <th>姓名</th> |
| <th>密码</th> |
| <th>年龄</th> |
| <th>余额</th> |
| <th>入职时间</th> |
| <th>性别</th> |
| <th>所属部门</th> |
| <th>操作</th> |
| |
| </tr> |
| </thead> |
| <tbody> |
| {% for obj in querty %} |
| <tr> |
| <th>{{ obj.id }}</th> |
| <td>{{ obj.name }}</td> |
| <td>{{ obj.password }}</td> |
| <td>{{ obj.age }}</td> |
| <td>{{ obj.account }}</td> |
| <td>{{ obj.create_time|date:"Y-m-d H:i:s" }}</td> |
| <td>{{ obj.get_gender_display }}</td> |
| <td>{{ obj.depart.title }}</td> |
| <td> |
| <a class="btn btn-primary btn-xs" href="/user/{{ obj.id }}/update">编辑</a> |
| <a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete">删除</a> |
| </td> |
| </tr> |
| {% endfor %} |
| |
| </tbody> |
| </table> |
| </div> |
| |
| <ul class="pagination"> |
| {{ page_string }} |
| </ul> |
| </div> |
| |
| {% endblock %} |
5. 编写添加html,app[templates][user_add.html]
| {% extends 'one.html' %} |
| |
| {% load static %} |
| |
| {% block css %} |
| <link rel="stylesheet" href="{% static 'plugins/datetimepicker/css/bootstrap-datetimepicker.min.css' %}"> |
| {% endblock %} |
| |
| {% block content %} |
| <div class="container"> |
| <div class="panel panel-default"> |
| <div class="panel-heading"> |
| <h3 class="panel-title">新建用户</h3> |
| </div> |
| <div class="panel-body"> |
| <form method="post"> |
| {% csrf_token %} |
| <div class="form-group"> |
| <label>姓名</label> |
| <input type="text" class="form-control" placeholder="姓名" name="user"> |
| </div> |
| <div class="form-group"> |
| <label>密码</label> |
| <input type="text" class="form-control" placeholder="密码" name="pwd"> |
| </div> |
| <div class="form-group"> |
| <label>年龄</label> |
| <input type="text" class="form-control" placeholder="年龄" name="age"> |
| </div> |
| <div class="form-group"> |
| <label>余额</label> |
| <input type="text" class="form-control" placeholder="余额" name="ac"> |
| </div> |
| <div class="form-group"> |
| <label>入职时间</label> |
| <input id="dt" type="text" class="form-control" placeholder="入职时间" name="ctime"> |
| </div> |
| <div class="form-group"> |
| <label>性别</label> |
| <select class="form-control" name="gd"> |
| {% for item in gender_choices %} |
| <option value="{{ item.0 }}">{{ item.1 }}</option> |
| {% endfor %} |
| </select> |
| </div> |
| <div class="form-group"> |
| <label>部门</label> |
| <select class="form-control" name="dp"> |
| {% for item in depart_list %} |
| <option value="{{ item.id }}">{{ item.title }}</option> |
| {% endfor %} |
| </select> |
| </div> |
| |
| |
| <button type="submit" class="btn btn-primary">提交</button> |
| </form> |
| </div> |
| </div> |
| </div> |
| |
| {% endblock %} |
| |
| {% block js %} |
| <script src="{% static 'plugins/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script> |
| <script src="{% static 'plugins/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js' %}"></script> |
| <script> |
| $(function(){ |
| $('#dt').datetimepicker({ |
| language:'zh-CN', |
| format: 'yyyy-mm-dd', |
| minView: "month", |
| todayBtn:"true" |
| }); |
| }) |
| |
| </script> |
| |
| {% endblock %} |
| from django import forms |
| |
| |
| class BootStrapModelForm(forms.ModelForm): |
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| |
| |
| for name, field in self.fields.items(): |
| |
| |
| if field.widget.attrs: |
| field.widget.attrs["class"] = "form-control" |
| field.widget.attrs["placeholder"] = field.label |
| else: |
| field.widget.attrs = { |
| "class": "form-control", |
| "placeholder": field.label} |
| |
| from app01 import models |
| from app01.utils.bootstrap import BootStrapModelForm |
| from django import forms |
| |
| |
| |
| class UserModelForm(BootStrapModelForm): |
| |
| name = forms.CharField(min_length=3, |
| label="用户名", |
| widget=forms.TextInput(attrs={"class": "form-control"}) |
| ) |
| |
| class Meta: |
| model = models.User |
| |
| fields = ["name", "password", "age", "account", "create_time", "gender", "depart"] |
| |
| |
| {% extends 'one.html' %} |
| |
| {% load static %} |
| |
| {% block css %} |
| <link rel="stylesheet" href="{% static 'plugins/datetimepicker/css/bootstrap-datetimepicker.min.css' %}"> |
| {% endblock %} |
| |
| {% block content %} |
| |
| <div class="container"> |
| <div class="panel panel-default"> |
| <div class="panel-heading"> |
| <h3 class="panel-title">新建用户</h3> |
| </div> |
| <div class="panel-body"> |
| |
| <form method="post" novalidate> |
| {% csrf_token %} |
| |
| {% for field in form %} |
| <div class="form-group"> |
| <label>{{ field.label }}</label> |
| |
| {{ field }} |
| <span style="color:red;"> {{ field.errors.0 }}</span> |
| </div> |
| {% endfor %} |
| |
| <button type="submit" class="btn btn-primary">提 交</button> |
| </form> |
| </div> |
| </div> |
| </div> |
| |
| {% endblock %} |
| |
| {% block js %} |
| <script src="{% static 'plugins/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script> |
| <script src="{% static 'plugins/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js' %}"></script> |
| <script> |
| $(function(){ |
| $('#id_create_time').datetimepicker({ |
| language:'zh-CN', |
| format: 'yyyy-mm-dd', |
| minView: "month", |
| todayBtn:"true" |
| }); |
| }) |
| |
| </script> |
| |
| {% endblock %} |
9. 编写修改html,app[templates][user_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"> |
| |
| <form method="post" novalidate> |
| {% csrf_token %} |
| |
| {% for field in form %} |
| <div class="form-group"> |
| <label>{{ field.label }}</label> |
| |
| {{ field }} |
| <span style="color:red;"> |
| {{ field.errors.0 }} |
| </span> |
| </div> |
| {% endfor %} |
| |
| <button type="submit" class="btn btn-primary">提 交</button> |
| </form> |
| </div> |
| </div> |
| </div> |
| |
| |
| {% endblock %} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人