凯发真人娱乐

巨蟒django之crm2 展示客户列表&&分页 -凯发真人娱乐

2023-10-19

1.展示客户列表

点击画红线中的views,进入下列界面

路径的查找顺序:应该是先查找外层的templates里边的html,然后查找app里边的templates

另一个会按照app的顺序进行寻找,在一开始的settings.py里边的配置文件

模板:

{% load static %}




路飞学城






{% block css %} {% endblock %}










{% block content %} {% endblock %}



{% block js %} {% endblock %}

layout.html

将这两个css样式放到静态文件下的css样式里边

插件放到项目的对应位置

将图片放到对应的位置

具体放入的位置如下图:

app也就是crm中的模板templates创建的customer_list.html需要继承layout.html文件,如下所示:

运行项目,得到如下结果:

上边是布局的整体结构内容

块级钩子

找到表结构中的内容进行对应

先查询出所有信息

运行:

下面我们学习创建超级用户

创建超级用户,用户名root,邮箱可以不填写,密码至少是8位不能是纯数字,也不能全部是字母

在这里我填写的超级用户的密码是:root123456

在浏览器中打开,

输入刚才创建的超级用户

点击登录:

这是自身创建的表

现在需要注册自己的模型,在自己的app模型下边

再次运行,得到下面的界面

点击customers,就可以进行添加操作了

表需要一一注册

将设置里边设置成中文的形式

这个时候,显示的就是中文了,深色表示必填的信息,浅色表示选填的信息

总结:

1. 展示客户列表
        使用admin
1. 创建超级用户
python manage.py createsuperuser
2. 注册model
在app下的admin.py中注册
from django.contrib import admin
from crm import models # register your models here.
admin.site.register(models.customer)

我们看到,顾客表和班级表是多对多的对应关系(也就是当前客户和已报班级是一对一的对应关系)

多对多的关系通过第三张表进行维护,也可以不填写,但是下面的,是必须填写的

null=true,表示数据库可以为空,blank=true表示填写表单的时候可以为空

显示的对象如下图:

  修改str,显示名字,下面修改的类是customer

刷新之后,得到的结果:

我们也可以点击进去修改名字:

我们也需要选择销售的str方法

我们需要在userprofile类,写上str方法目的是销售

这个时候就可以显示出来销售的名字了

班级也要显示,我们需要对班级表进行管理

也就是我们需要在admin里边注册上班级表&&校区表

运行之后,得到的结果,点击进去,进行添加

也可以在这个位置进行添加,

注意下面的红线走向

选中之后,保存

再添加一条数据:

下面开始展示数据效果:

开始加样式

运行,得到结果:

通过名字进行用过滤器进行填写

通过点sex拿到后边对应的值,男或者女?

下面是前端,提供的一个方法:

这样,我们就拿到了对应的结果:

就是因为下面的属性引起的

上边的原因是,前端的代码是有顺序的,调整之后已经正常了,得到下面的结果:

出生日期也是会根据settings.py的语言环境的变化而发生变化的

下面我们改成中文环境

运行:这个时候就会发生了变化

我们也可以看到这个字段是datafield字段,下面我们进行操作

得到结果:

这个日期需要一个一个改,有什么办法可以进行一次修改吗???

只需要进行配置一个东西

现在,我们去掉过滤日期的类型,依然得到下面的结果:

运行之后,依然得到下面的结果:

年月日,时分秒

总结:

展示不同字段的方式:
1. 普通字段
对象.字段名
2. choices
对象.字段名 -> 真实的值
对象.get_字段名_display() -> 中文显示值 3. 外键
对象.外键 —— 》 定义str
对象.外键.name
4. 其他
定义函数
def show_class(self):
return ' | '.join([ str(i) for i in self.class_list.all()])
日期格式化的配置:
use_l10n = false
date_format = 'y-m-d'
datetime_format = 'y-m-d h:i:s'
后端safe
from django.utils.safestring import mark_safe

绑定销售之后,直接得到下面的结果:

也就是因为定义了这个方法

外键:

得到的结果是:

多对多拿到的结果是,管理对象,也就是另一个对象,我们想要拿到锁关联的班级,上图显示的已报班级是一个(crm.classlist.none)

得到的结果是:

得到的结果不好看,我们可以通过这个多对多的接口定义方法:

我们在前端,再写一行,看显示的结果:

运行:

,现在我们需要,自定义方法,得到我们需要的结果

如何展示这个班级?

这个自定义函数里边的self代表什么?指的是当前类customer的对象

首先处理班级列表里边的内容:

我们在用户表(customer)里边,调用班级表(classlist)

class_list就是上边的接口,多对多,也就是customer表

运行,得到下图的结果:

校区没有显示具体的名字,我们现在定义一下

因为,班级列表classlist和校区列表(campuses)是外键关系

得到如下所示的结果:

我们在admin里边选择两个班级,得到的结果是:

运行:

我们再写状态

注释掉电话

修改状态:

虽然可以显示出来,但是状态不明显.

状态内容,修改成背景颜色

向外扩充一点padding:2px

我们可以想办法在后端处理这个事情,在customer类中

在前端,调用这个函数

现在,我们看到的是字符串

只需要在前端加上safe

这样就可以成功显示结果了

颜色需要调整一下,做判断或者设置对应关系,通过字典

点击"进去",拿到下面的四种状态.

这样就成功实现了颜色的区分

如果不想在前端显示这个状态safe,在后端写

导入模块

用这个安全模块进行包裹

运行:依然可以得到想要的结果

对颜色进行修改:

通过右下角进行颜色的选择

2.分页

(1) 展示所有页面

数据量比较少,如何做?

写一个测试页面,在项目下,添加路由urls.py

分页,点击上边的views,进入下面界面,也就是crm里边的views.py文件

将得到的字典,返回到前端页面

运行:

分页的目的是,几条一页

如何处理这些数据?

运行之后,服务端得到的值是1

下面进行判断一下

数字小于1,输入的页码不是数字

输入页码错误会报错

在后边我们进行切片

这样一页就是20条数据

在bootstrap中找到组件里边的分页功能代码

这个时候就有了

最后只留下一个,通过循环,得到即可

也就是总的数据量除以显示的数据量,也就是余数的问题

鼠标放到1上,可以看到左下角的地址,点击就可以实现功能了

(2)处理左右极值

下面进行限制一下,因为太长了页码数

前后都显示5个,(设置当前显示的页码数)

#最大显示的页码数

如何动态的显示下面的界面?

成功改变了

当前的问题,如何处理极值的问题

前后都多了

数据量少,不够怎么办?最大值和最小值问题?

(3)添加上下页和选中

运行:(相当于在后端对其进行循环)

如何加上一页和下一页?

加头加尾

走到1,上边就不能点了

最后边这个需要写在最后边的.

如何让页面显示的更突出一些?

(4)封装成类以及使用

升级,从函数调用到封装成类

在整个项目下新建文件utils,在其中建立一个分页(pagination.py)py文件

views.py

from django.shortcuts import render,redirect,reverse,httpresponse
from crm import models
from crm.froms import regform
import hashlib
from utils.pagination import pagination
# create your views here.
def index(request):
return httpresponse('index') def login(request):
# print(request.post)
# 获取用户名和密码与数据库中的数据对比
if request.method=='post':
user=request.post.get('username')
pwd=request.post.get('password') md5 = hashlib.md5()
md5.update(pwd.encode('utf-8'))
pwd = md5.hexdigest() obj=models.userprofile.objects.filter(username=user,password=pwd,is_active=true).first()
if obj:
#登录成功,跳转到凯发真人娱乐主页面
return redirect(reverse('index'))
else:
#登录失败
return render(request,'login.html',{'error':'用户名或密码错误'})
# is_active表示为true的状态下,才能够登录
return render(request,'login.html') #注册
def reg(request):
form_obj=regform()
#判断请求方式
if request.method=='post':
form_obj=regform(request.post)
#对数据进行校验
if form_obj.is_valid(): #is_valid是对数据进行校验
#内置校验,校验器的方法,钩子,判断是否有,内部只有clean方法
#数据正确 插入数据库
# print(form_obj.cleaned_data)
# form_obj.cleaned_data.pop('re_password')
# models.userprofile.objects.create(**form_obj.cleaned_data)
form_obj.save()
return redirect(reverse('login'))
return render(request,'reg.html',{'form_obj':form_obj}) #展示客户列表
def customer_list(request):
all_customer = models.customer.objects.all()
return render(request,'customer_list.html',{'all_customer':all_customer}) users=[{'name':"alex{}".format(i),'pwd':''} for i in range(1,302)]
#分页
# def user_list(request):
# '''
# 一页显示20条
# 第1页 0 20
# 第2页 20 40
# ...
# 第n页 (n-1)20 20n
# :param request:
# :return:
# '''
# #获取页码
# try:
# page_num=int(request.get.get('page','1')) #默认值为1
# if page_num<=0:
# page_num=1
# except exception as e:
# page_num=1
# #每页显示的数据量
# per_num=10
#
# #总数据量
# all_count=len(users)
# #总页码数
# page_count,more=divmod(all_count,per_num) #商数,余数
# if more:
# page_count =1
# #最大显示页码数
# max_show=11
# half_show=max_show//2
#
# #总页码数<最大显示页码数
# if page_count # page_start=1
# page_end=page_count
# else:
# #处理左边极值
# if page_num<=half_show:
# page_start=1
# page_end=max_show #也可以直接写11
# #处理右边极值
# elif page_num half_show>=page_count:
# page_start=page_count-max_show 1
# page_end=page_count
# else:
# page_start=page_num-half_show
# page_end=page_num half_show
# page_list=[]
# if page_num==1:
# page_list.append('')
# else:
# page_list.append(''.format(page_num-1,))
# for i in range(page_start,page_end 1):
# if i==page_num:
# page_list.append(''.format(i,i))
# else:
# page_list.append(''.format(i,i))
# if page_num==page_count:
# page_list.append('')
# else:
# page_list.append(''.format(page_num 1,))
# page_html = ''.join(page_list)
# # return render(request,'user_list.html',{'users':users[(page_num-1)*per_num:per_num*page_num],'page_count':range(1,page_count 1)})
# # return render(request,'user_list.html',{'users':users[(page_num-1)*per_num:per_num*page_num],'page_count':range(2,12 1)})
# # return render(request,'user_list.html',{'users':users[(page_num-1)*per_num:per_num*page_num],'page_count':range(page_start,page_end 1)})
# return render(request,'user_list.html',{'users':users[(page_num-1)*per_num:per_num*page_num],'page_html':page_html}) # 分页
def user_list(request):
'''
一页显示20条
第1页 0 20
第2页 20 40
...
第n页 (n-1)20 20n
:param request:
:return:
'''
page=pagination(request.get.get('page',1),len(users))
return render(request, 'user_list.html',
{'users': users[page.start:page.end], 'page_html':page.page_html })

pagination.py

# author: studybrother sun
class pagination:
def __init__(self,page_num,all_count,per_num = 10,max_show = 11):
# 获取页码
try:
# page_num = int(request.get.get('page', '1')) # 默认值为1
self.page_num = int(page_num) # 默认值为1
if self.page_num <= 0:
self.page_num = 1
except exception as e:
self.page_num = 1
# 每页显示的数据量
self.per_num = per_num # 总数据量
all_count = all_count
# 总页码数
self.page_count, more = divmod(all_count, per_num) # 商数,余数
if more:
self.page_count = 1
# 最大显示页码数
self.max_show = 11
self.half_show = max_show // 2 @property
def page_html(self):
# 总页码数<最大显示页码数
if self.page_count < self.max_show:
page_start = 1
page_end = self.page_count
else:
# 处理左边极值
if self.page_num <= self.half_show:
page_start = 1
page_end = self.max_show # 也可以直接写11
# 处理右边极值
elif self.page_num self.half_show >= self.page_count:
page_start = self.page_count - self.max_show 1
page_end = self.page_count
else:
page_start = self.page_num - self.half_show
page_end = self.page_num self.half_show
page_list = []
if self.page_num == 1:
page_list.append('')
else:
page_list.append(''.format(self.page_num - 1, ))
for i in range(page_start, page_end 1):
if i == self.page_num:
page_list.append(''.format(i, i))
else:
page_list.append(''.format(i, i))
if self.page_num == self.page_count:
page_list.append('')
else:
page_list.append(''.format(self.page_num 1, ))
# page_html = ''.join(page_list)
return ''.join(page_list) # 最后需要的就是这个 #开始
@property
def start(self):
'''
切片起始值
:return:
'''
return (self.page_num-1)*self.per_num
@property
def end(self):
'''
切片终止值
:return:
'''
return (self.page_num)*self.per_num

user_list.html

{% extends 'layout.html' %}
{% block content %}

{% for user in users %}




{% endfor %}
{{ user.name }} {{ user.pwd }}

{% endblock %}

layout.html

{% load static %}




路飞学城






{% block css %} {% endblock %}











{% block content %} {% endblock %}




{% block js %} {% endblock %}

巨蟒django之crm2 展示客户列表&&分页的相关教程结束。

网站地图