#前端 对后端返回数据进行处理,自带filter
后端返回:status = "很高兴见到你" , word=' nice too meet you’
1-{{ status|length }} ==6, 长度
2-{{ word|upper }} ,大写
3-{{ tmp_html|safe }},识别html
4-{{ word|truncatechars:5 }}==ni..., 展示5个字符、其余省略
5-{{word.0}} 取第一个元素
#自定义filter,自定义SimpleTag,在app根目录创建templates目录,创建tmpTags .py文件,
from django import template register = template.Library() #固定写法 #自定义过滤器 @register.filter def demo_filter(x): #x可以为后端返回的参数 if x == 1: return 'success' else: return 'faild'
#前端;
{% load tmpTags %}
{{ status|demo_filter }} == success
@register.filter
def test_filter(x, y):
return x + y
filter最多支持2个参数,管道符左侧为第一个参数,冒号后为第二个参数, {{ 1|filter_demo:2 }}
#自定义simple_tag
@register.simple_tag
def simple_tag_demo(x, y,z):
return x + y + z
{% simple_tag_demo 1 2 3 %} --前端
simple_tag可以支持多个参数,通过空格进行分格即可
#models ORM操作多对多
class Student(models.Model): name = models.CharField(verbose_name='学生姓名',max_length=50) age = models.IntegerField(verbose_name='年龄') class Meta: db_table = 'students' class Teacher(models.Model): name = models.CharField(verbose_name='老师姓名',max_length=50) student = models.ManyToManyField(Student,verbose_name='学生') #创建多对多 class Meta: db_table='teacher'
数据库中创建了三张表:
#写入多对多关系
多对多关系
teacher_obj = models.Teacher.objects.get(id=2) # id=1 牛牛 id=2 大师兄
student_obj = models.Student.objects.get(id=4)
创建多对多关系 (方法1)
teacher_obj.student.add(student_obj)
创建多对多 (方法2)
add方法可以接收主键id=(student_id)
teacher_obj.student.add(4)
#查询多对多-正向查询,查询teacher对应的所有student
students = teacher_obj.student.all()
#反向查询,查询student对应的所有teacher
teachers = student_obj.teacher_set.all()
#删除多对多关系
teacher_obj.student.clear() #删除老师对应的所有学生
teacher_obj.student.remove(2) #删除指定的某个学生
teacher_obj.student.remove(student_obj)
# orm 返回的 有两种数据类型 QuerySet object
# QuerySet, 支持链式编程,可以在all()后继续.方法
teachers = models.Teacher.objects.all()
name = teachers.values('name') # 过滤字段,获取我们希望获取到字段
count = teachers.count() # 返回qs的个数
firstData = teachers.first() # 获取qs中第一个数据 list[0]
value_name = teachers.values_list('name') # 只返回 要求过滤的字段的 value值不返回key
# object
teacher = models.Teacher.objects.get(id=1)
# print("teacher.name", teacher.name)
#过滤orm, filter=where
# teacher = models.Teacher.objects.filter(name__contains='师') # 过滤 模糊查询 == sql中 %
# teacher = models.Teacher.objects.filter(name__endswith='牛') # 过滤 以什么为结尾
# teacher = models.Teacher.objects.filter(name__startswith='师') # 过滤 以什么开头
# teacher = models.Teacher.objects.filter(name__in=['大师兄','牛牛']) # 过滤 在什么范围内 == sql in条件
# teacher = models.Teacher.objects.filter(id__gt=1) # 过滤 大于
# teacher = models.Teacher.objects.filter(id__gte=1) # 过滤 大于等于
# teacher = models.Teacher.objects.filter(id__lt=2) # 过滤 小于
# teacher = models.Teacher.objects.filter(id__lte=2) # 过滤 小于等于
# student = models.Student.objects.filter(id__range=[1,3]) # 过滤 在1到4之间 between and
# 排除
# 除了name=大师兄 其他都查出来
# teacher = models.Teacher.objects.exclude(name='大师兄')
# 多条件查询
# and
# teacher = models.Teacher.objects.filter(id=1, name='牛牛') # where id=1 and name=牛牛
#or
from django.db.models import Q
# where id=1 or name=大师兄
# teacher = models.Teacher.objects.filter(Q(id=1) | Q(name='大师兄')) # or | 只要条件成立 就把数据都查出来
# where id=1 and name=大师兄
teacher = models.Teacher.objects.filter(Q(id=1) & Q(name='大师兄')) # and & 只要条件成立 就把数据都查出来
# 取反的功能
# where id=1 and name!=大师兄
teacher = models.Teacher.objects.filter(Q(id=1) & ~Q(name='大师兄')) # and & 只要条件成立 就把数据都查出来
django-forms,后端对前端的数据进行验证
app下新建forms.py 导入:
from django import forms
from django.core.exceptions import ValidationError
class ArticleForm(forms.Form):
title = forms.CharField(
required=True, #是否必填
error_messages={
'required':'必填参数未填', #错误信息提示
}
)
在views逻辑中引用
from user.forms import ArticleForm
def article(request):
if request.method == 'GET':
return render(request,'post.html')
else:
articleObj = ArticleForm(request.POST) #实例化form验证器,接受post传过来的数据
f = articleObj.is_valid() #判断当前写好的验证器是否验证通过, 返回True or false
print("is_valid",f)
print(articleObj.errors) #拿到错误信息
return HttpResponse('ok')
def article(request):
if request.method == 'GET':
return render(request,'post.html')
else:
articleObj = ArticleForm(request.POST) #实例化form验证器,接收post传过来的数据
f = articleObj.is_valid() #判断当前写好的验证器是否验证通过,返回true or false
if f:
print(articleObj.cleaned_data) #验证通过的字段放在cleaned_data中
msg = '成功'
else:
print("is_valid", f)
print(articleObj.errors)
print(articleObj.errors.get_json_data()) #拿到错误信息
msg = articleObj.errors.get_json_data().get('title')[0].get('message') #通过dict方式取,返回给前端
return HttpResponse(msg)
return HttpResponse(msg)
自定义验证条件:
def test_phone(value): #自定义
if len(value) != 11:
raise ValidationError('手机格式不正确')
else:
return value
class ArticleForm(forms.Form):
phone = forms.CharField(
required=True, #是否必填
validators=[test_phone], #引入自定义验证
error_messages={
'required':'必填参数未填', #错误信息提示
}
)
forms中存在钩子函数,验证顺序 3 》2 》1
def test_phone(value):
print(3)
if len(value) != 11:
raise ValidationError('手机格式不正确')
else:
return value
class ArticleForm(forms.Form):
phone = forms.CharField(
required=True, #是否必填
validators=[test_phone], #自定义验证 #第一步先验证
error_messages={
'required':'必填参数未填', #错误信息提示
}
)
#forms中存在钩子函数 clean
#1-通过cleaned_data验证所有数据 #第三部验证
def clean(self): #froms
print(1)
return self.cleaned_data
#2-针对个别字段验证
def clean_phone(self): #针对title字段验证 #第二步验证
print(2)
return self.cleaned_data.get('phone')
model+form, 结合数据库表进行验证
class StudentForm(forms.ModelForm):
class Meta:
model = models.Student #创建变了和model建立映射关系
fields = '__all__' #验证全部字段
views中逻辑:
def student(request):
if request.method == 'GET':
return render(request,'student.html')
else:
studentObj = StudentForm(request.POST)
f = studentObj.is_valid()
if f :
print(studentObj.cleaned_data)
else:
print(studentObj.errors)
return HttpResponse('ok')