crm项目之创建admin账户,展示客户列表,日期格式全局配置,展示不同字段, make_safe()防止转义
一.展示客户列表
由于表的关系错综复杂,人为的在数据库中向表中添加数据非常麻烦,涉及到许多外键,多对多关系,不好添加.所以使用django中提供的admin来向数据表中添加数据,就是urls.py中的这个admin

1.创建管理员账户
一开始进入是没有初始用户的,需要创建一个用户,在terminal中输入指令创建管理员账户
Python manage.py createsuperuser
2. 注册model
进入管理系统之后,发现没有models中的表可以管理,需要在APP下的admin.py中注册models,
from django.contrib import admin from app01 import models # Register your models here. admin.site.register(models.Customer) admin.site.register(models.ClassList) admin.site.register(models.Campuses)
我这里注册了三张表,作为基本实现使用
admin系统中的字段显示文字
进入后有的正文会显示为这样,想要显示model中的display字段,需要重写models中的__str__方法
class Customer(models.Model): """ 客户表 """ qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ号必须唯一') qq_name = models.CharField('QQ昵称', max_length=64, blank=True, null=True) name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='学员报名后,请改为真实姓名') sex_type = (('male', '男'), ('female', '女')) sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True) birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True) phone = models.BigIntegerField('手机号', blank=True, null=True) source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq') introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True) course = MultiSelectField("咨询课程", choices=course_choices) class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime') customer_note = models.TextField("客户备注", blank=True, null=True, ) status = models.CharField("状态", choices=enroll_status_choices, max_length=64, default="unregistered", help_text="选择客户此时的状态") last_consult_date = models.DateField("最后跟进日期", auto_now_add=True) next_date = models.DateField("预计再次跟进时间", blank=True, null=True) consultant = models.ForeignKey('UserProfile', verbose_name="销售", related_name='customers', blank=True, null=True, ) class_list = models.ManyToManyField('ClassList', verbose_name="已报班级", blank=True) def __str__(self): return "{}-{}".format(self.qq, self.name) def show_class(self): # 显示 选择课程的方法 可以在表格中显示多个课程 return ",".join([str(c) for c in self.class_list.all()]) # 将查询出的queryset集合生成列表用|拼接 def show_status(self): ''' (('signed', "已报名"), ('unregistered', "未报名"), ('studying', '学习中'), ('paid_in_full', "学费已交齐")) :return: ''' status_color = { 'signed':'yellow', 'unregistered':'red', 'studying':'blue', 'paid_in_full':'green', } return mark_safe(f'<span style="background-color:{status_color.get(self.status)};color:white;padding:2px">' f'{self.get_status_display()}</span>')
结果就会显示名称



3.展示不同字段的方式
1.普通字段 对象.对象名 2. choices 对象.字段名 -> 真实的值 对象.get_字段名_display() ->中文显示值 3. 外键 对象.外键 --- > 定义__str__方法 对象.外键.name
4.其他 在models.py中定义函数 def show_class(self): # class是字段名 return ' | '.join([ str(i) for i in self.class_list.all()])
views.py中
def customer_list(requset): customer_obj = models.Customer.objects.all() return render(requset, 'customer_list.html',{"customer_obj":customer_obj})
前端html文件
{% extends 'layout.html' %} {% block content %} <table class="table table-bordered table-hover"> <thead> <tr> <td>序号</td> <td>qq</td> <td>姓名</td> <td>性别</td> <td>出生日期</td> {# <td>手机号</td>#} <td>客户来源</td> <td>咨询课程</td> <td>状态</td> <td>最后跟进</td> <td>销售</td> <td>已报班级</td> </tr> </thead> <tbody> {% for customer in customer_obj %} <tr> <td>{{ forloop.counter }}</td> <td>{{ customer.qq }}</td> <td>{{ customer.name }}</td> <td>{{ customer.get_sex_display }}</td> <td>{{ customer.birthday }}</td> {# <td>{{ customer.phone }}</td>#} <td>{{ customer.source }}</td> <td>{{ customer.course }}</td> <td>{{ customer.show_status }}</td> <td>{{ customer.last_consult_date }}</td> <td>{{ customer.consultant }}</td> <td>{{ customer.show_class }}</td> </tr> {% endfor %} </tbody> </table> {% endblock %}
日期格式化的全局配置(2种方式):
1. 在settings.py中配置
USE_L10N = False # 关闭使用本地格式化输出 DATE_FORMAT = 'Y-m-d' # 日期配置 DATETIME_FORMAT = 'Y-m-d H:i:s' # 日期时间配置
2.在前端模版中使用过滤器来配置
{{ value|date:"Y-m-d H:M:S" }}
后端向前端直接传html语言防止转义的方法(2种)
目的,为了让前端对后端传输的这种方式不转义
![]()
1.使用mark_safe()
from django.utils.safestring import mark_safe # 后端safe
2.使用safe过滤器
{{ value|safe }}

浙公网安备 33010602011771号