django自带的序列化组件
def transfer_data (request ):
data_list = []
user_queryset = models.User.objects.all ()
for user_obj in user_queryset:
data_list.append({
'pk' : user_obj.pk,
'name' : user_obj.name,
'age' : user_obj.age,
'gender' : user_obj.gender,
'gender_real' : user_obj.get_gender_display(),
'addr' : user_obj.addr
})
return JsonResponse(data_list, safe=False )
def transfer_data (request ):
user_queryset = models.User.objects.all ()
res = serializers.serialize('json' , user_queryset)
return HttpResponse(f'<br><br><br><br><p style="text-align:center">{res} </p>' )
批量数据操作
def bulk_data (request ):
for i in range (1 , 1000 ):
models.Book01.objects.create(title=f'第{i} 本书' )
page_queryset = models.Book01.objects.all ()
return render(request, 'bulk_data.html' , locals ())
def bulk_data (request ):
book_list = []
for i in range (1 , 10000 ):
source_book_obj = models.Book01(title=f'遮天-第{str (i).zfill(4 )} 章' )
book_list.append(source_book_obj)
models.Book01.objects.bulk_create(book_list)
page_queryset = models.Book01.objects.all ()
return render(request, 'bulk_data.html' , locals ())
分页器推导流程
简易版本
def bulk_data (request ):
data_queryset = models.Book01.objects.all ()
current_page_num = request.GET.get('page' )
try :
current_page_num = int (current_page_num)
except Exception:
current_page_num = 1
per_page_num = 10
start_num = (current_page_num - 1 ) * per_page_num
stop_num = current_page_num * per_page_num
show_num = 11
all_count = data_queryset.count()
page_num, more = divmod (all_count, per_page_num)
if more:
page_num += 1
html = ''
page = current_page_num
if current_page_num < 6 :
page = 6
for i in range (page-5 , page+6 ):
if current_page_num == i:
html += '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i)
else :
html += '<li><a href="?page=%s">%s</a></li>' % (i, i)
book_queryset = data_queryset[start_num:stop_num]
return render(request, 'bulk_data.html' , locals ())
优化版本
def bulk_data (request ):
data_queryset = models.Book01.objects.all ()
from utils import mypage
book_queryset = models.Book01.objects.all ()
page_obj = mypage.Pagination(current_page=request.GET.get('page' ), all_count=book_queryset.count())
page_queryset = book_queryset[page_obj.start:page_obj.end]
return render(request, 'bulk_data.html' , locals ())
需求:编写一个校验用户名和密码是否合法的功能
前端需要编写获取用户数据的各种标签
前端需要想方设法的展示错误的提示信息
后端需要想方设法的编写校验代码(很多if 判断)
form组件可以一次性搞定上面的三件事
1. 数据校验
2. 标签渲染
3. 展示信息
from django import forms
class MyForm (forms.Form):
username = forms.CharField(min_length=5 ,max_length=10 )
age = forms.IntegerField(min_value=0 ,max_value=120 )
email = forms.EmailField()
校验数据
from app01 import views
form_obj =MyForm({'username' :'linda' ,'age' :24 ,'email' :'6666' })
form_obj.is_valid()
form_obj.errors
{'age' : ['Ensure this value is less than or equal to 120.' ]}
form_obj.cleaned_data
{'username' : 'linda' , 'age' : 24 }
忽略某些字段的方法 required=False
渲染标签
渲染方式1 :封装程度高 扩展性较差 主要用于快速生成页面测试功能
{{ form_obj.as_p }}
{{ form_obj.as_table }}
{{ form_obj.as_ul }}
渲染方式2 :封装程度低 扩展性较好 字段较多的情况下开发效率较低
{{ form_obj.username.label }}
{{ form_obj.username }}
渲染方式3 :推荐使用
{% for form in form_obj %}
<p>
{{ form.label }}
{{ form }}
</p>
{% endfor %}
注意:渲染标签中文提示可以使用参数label指定,不指定默认使用字段名首字母大写
展示信息
class MyForm (forms.Form):
username = forms.CharField(min_length=5 , max_length=10 , label='用户名' ,
error_messages={
'min_length' : '用户名最短5位' ,
'max_length' : '用户名最长10位' ,
'required' : '用户名必填'
}
)
age = forms.IntegerField(min_value=0 , max_value=120 , label='年龄' ,
error_messages={
'min_value' : '年龄不能小于0' ,
'max_value' : '年龄不能大于120' ,
}
)
email = forms.EmailField(label='邮箱' ,
error_messages={
'' : '邮箱必须含有@符号'
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?