唐山公司网站建设 中企动力唐山,无货源电商软件app,十大免费自媒体素材网站,电子商务网站建设 以为例提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 一、部门列表二、部门管理#xff08;增删改#xff09;三、用户管理过渡到modelform组件四、modelform实例#xff1a;靓号操作五、自定义分页组件六、datepick… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 一、部门列表二、部门管理增删改三、用户管理过渡到modelform组件四、modelform实例靓号操作五、自定义分页组件六、datepick时间插件的使用在layout.html模板文件中引入datepick的js、css1.直接在字段中添加 iddt2.基于ModelForm 七、自定义有Bootstrap样式的ModelForm 一、部门列表
1.在models.py下
class Department(models.Model):部门表title models.CharField(verbose_name标题,max_length32)def __str__(self):return self.title
2.在views文件下 def …(request):return(request,’…html’)
def depart_list(request):部门类# 去数据库中获取所有的部门列表queryset models.Department.objects.all()return render(request, depart_list.html, queryset )3.depart_list.html文件下
{% extends layout.html %}{% block content %}div classcontainerdiv classpanel panel-default stylemargin-top: 20px;!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span批量上传/divdiv classpanel-bodyform methodpost enctypemultipart/form-data action/depart/multi/{% csrf_token %}div classform-groupinput typefile nameexc/divinput typesubmit value上传 classbtn btn-info btn-sm/form/divdiv stylemargin-bottom: 10px/divdiv classpanel-headinga classbtn btn-success btn-xs href/depart/add/span classglyphicon glyphicon-plus aria-hiddentrue/span新建部门/a/div!-- Table --table classtabletheadtrthid/thth名称/thth操作/th/tr/theadtbody{% for obj in queryset %}trth scoperow{{ obj.id }}/thtd{{ obj.title }}/tdtda href/depart/{{ obj.id }}/edit/ classbtn btn-primary btn-xs 编辑/aa href/depart/delete/?nid{{ obj.id }} classbtn btn-danger btn-xs 删除/a/td/tr{% endfor %}/tbody/table/div/div!-- /.container --{% endblock %}二、部门管理增删改
注意两个html文件中都需要{% load static %} 添加部门 1)在urls.py下创建path(‘depart/add/’, views.depart_add), 2)在views.py下创建def depart_add(request)
def depart_add(request):添加部门if request.method GET:return render(request, depart_add.html)# 获取用户POST提交过来的数据title request.POST.get(title)# 保存到数据库models.Department.objects.create(titletitle)# 重定向部门列表return redirect(/depart/list/)
3)templates目录下创建depart_add.html
{% extends layout.html %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-heading新建部门/divdiv classpanel-bodyform classform-horizontal methodpost{% csrf_token %}div classform-grouplabel classcol-sm-2 control-label标题/labeldiv classcol-sm-10input typetext classform-control placeholder标题 nametitle//div/divdiv classform-groupdiv classcol-sm-offset-2 col-sm-10button typesubmit classbtn btn-primary提 交/button/div/div/form/div/div/div
{% endblock %}4)在depart_list.html文件下新建部门处链接到depart/add/地址
删除部门 1)在urls.py下创建path(‘depart/delete/’, views.depart_delete), 2)在views.py下创建def depart_delete(request) 删除 href“/depart/delete/?nid{{ obj.id }}”
def depart_delete(request):删除部门# 获取idnid request.GET.get(nid)# 删除models.Department.objects.filter(idnid).delete()# 跳转重定向回部门列表return redirect(/depart/list/)
3)在depart_list.html文件下的删除按钮内
a href/depart/delete/?nid{{ obj.id }} classbtn btn-danger btn-xs 删除/a编辑部门 1)在urls.py下创建path(‘depart/ int:nid /edit/’, views.depart_edit), http://127.0.0.1:8000/depart/int/edit/ 编辑 href“/depart/{{ obj.id }}/edit/”
path(depart/int:nid/edit/, views.depart_edit),2)在views.py下创建def depart_edit(request,nid)
def depart_edit(request, nid):编辑部门if request.method GET:# 根据id获取编辑的数据row_object models.Department.objects.filter(idnid).first()print(row_object.id, row_object.title)# 重定向到编辑页面return render(request, depart_edit.html, {row_object: row_object})# 用户提交的标题title request.POST.get(title)# 根据id在数据库中进行更新models.Department.objects.filter(idnid).update(titletitle)# 跳转重定向回部门列表return redirect(/depart/list/)
3)vaule表示默认值在depart_list.html文件下的编辑按钮内 value“{{ row_object.title }}”
{% extends layout.html %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-heading修改部门/divdiv classpanel-bodyform classform-horizontal methodpost{% csrf_token %}div classform-grouplabel classcol-sm-2 control-label标题/labeldiv classcol-sm-10input typetext classform-control placeholder标题 nametitle value{{ row_object.title }}//div/divdiv classform-groupdiv classcol-sm-offset-2 col-sm-10button typesubmit classbtn btn-primary提 交/button/div/div/form/div/div/div
{% endblock %}三、用户管理过渡到modelform组件
获取数据
insert into app01_userinfo(name,password,age,account,creat_time,gender,depart_id) values(刘乐,1e4q,42,3321.02,2010-03-11,2,11);在models.py文件下
class UserInfo(models.Model):员工表name models.CharField(verbose_name姓名,max_length32)password models.CharField(verbose_name密码,max_length32)age models.IntegerField(verbose_name年龄)account models.DecimalField(verbose_name余额,max_digits10,decimal_places2,default0)creat_time models.DateField(verbose_name入职时间)
# 有约束 on_deletemodels.CASCADE级联删除depart models.ForeignKey(verbose_name所属部门,toDepartment,to_fieldid,on_deletemodels.CASCADE)
# 链接部分被删除时置空
# depart models.ForeignKey(toDepartment,to_fieldid,nullTrue,blankTrue,on_deletemodels.SET_NULL)
# 在django中做的约束gender_choices((1,男),(2,女),)gender models.SmallIntegerField(verbose_name性别,choicesgender_choices)在user_list.html文件下
注意return render(request,user_list.html, {queryset: queryset})双引号、花括号、冒号
th{{ obj.id }}/th
td{{ obj.name }}/td
td{{ obj.password }}/td
td{{ obj.age }}/td
td{{ obj.account }}/td
td{{ obj.creat_time|date:Y-m-d }}/td#日期的读取
td{{ obj.get_gender_display }}/td#性别
td{{ obj.depart.title }}/td #关联其他表的读取在没有利用Django组件ModelForm组件下
添加用户
def user_add(request):if request.method GET:context {gender_choices: models.UserInfo.gender_choices,depart_list: models.Department.objects.all()}return render(request, user_add.html, context)name request.POST.get(name)password request.POST.get(password)age request.POST.get(age)account request.POST.get(account)# from django.utils import timezone# creat_time timezone.now()creat_time request.POST.get(creat_time)gender request.POST.get(gender)depart_id request.POST.get(depart_id)models.UserInfo.objects.create(namename, passwordpassword, ageage,accountaccount, creat_timecreat_time,gendergender, depart_iddepart_id)return redirect(/user/list/)
利用Django组件ModelForm组件 在views.py文件下
class UserModelForm(forms.ModelForm):# name forms.CharField(min_length3, label用户名)class Meta:model models.UserInfofields [name, password, age, account, creat_time, gender, depart]# widgets {# name:forms.TextInput(attrs{class:col-sm-2 control-label})# }def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件添加了class:form-control得样式for name, field in self.fields.items():print(name, field)field.widget.attrs {class: form-control, placeholder: field.label}
添加用户 GET下form UserModelForm() POST下form UserModelForm(datarequest.POST)
from django import forms
def use_model_form_add(request):添加用户if request.method GET:form UserModelForm()return render(request, user_model_form_add.html, {form: form})# 用户提交的数据进行校验如果合法再保存到数据库form UserModelForm(datarequest.POST)if form.is_valid():# print(form.cleaned_data)form.save()return render(request, user_model_form_add.html, {form: form})
html文件中 span style“color: red”{{ field.errors.0 }}/ span 为提示错误信息 将英文提示改为中文提示信息时需要将settings.py文件中改为 LANGUAGE_CODE ‘zh-hans’
#settings.py
# LANGUAGE_CODE en-us
LANGUAGE_CODE zh-hans#html
div classcol-sm-offset-2 col-sm-10label{{ field.label }}/label{{ field }}span stylecolor: red{{ field.errors.0 }}/span
{# input typetext classform-control placeholder年龄 nameage/#}
/div编辑用户 GET下form UserModelForm(instancerow_object) POST下form UserModelForm(datarequest.POST, instancerow_object)
#views.py
from django import forms
def user_edit(request, nid):编辑用户# 根据id去数据库获取要编辑的那一行数据row_object models.UserInfo.objects.filter(idnid).first()if request.method GET:# instancerow_object表示将数据库中获取的那行的每一个值都显示在页面上form UserModelForm(instancerow_object)return render(request, use_edit.html, {form: form})form UserModelForm(datarequest.POST, instancerow_object)if form.is_valid():form.save()return redirect(/user/list)return render(request, user_edit.html, {form: form})
删除用户
def user_delete(request, nid):删除用户models.UserInfo.objects.filter(idnid).delete()return redirect(/user/list/)四、modelform实例靓号操作
#urls.py
#int:nid表明要传递nid这个值到views.py文件中
path(pretty/list/, views.pretty_list),path(pretty/add/, views.pretty_add),path(pretty/int:nid/edit/, views.pretty_edit),path(pretty/int:nid/delete/, views.pretty_delete),首先在models.py文件下定义PrettyNum这个类同时用djando命令生成数据库表python manage.py makemigrationspython manage.py migrate数据库下才有app01_prettynum这个数据表
#models.py
class PrettyNum(models.Model):靓号表mobile models.CharField(verbose_name电话, max_length11)price models.IntegerField(verbose_name单价,default0)level_choices ((1, 1级),(2, 2级),(3, 3级),(4, 4级),)level models.SmallIntegerField(verbose_name级别, choiceslevel_choices,default1)status_choices ((1, 已占用),(2, 未占用),)status models.SmallIntegerField(verbose_name状态, choices status_choices,default2)
添加靓号
#ModelForm类
from django import forms
from django.core.validators import RegexValidatorclass PrettyModelForm(forms.ModelForm):# 验证方法1mobile forms.CharField(label手机号,# validators[RegexValidator(r^159[0-9]$,数字必须以159开头)],validators[RegexValidator(r^1[3-9]\d{9}$, 手机号格式错误)],)class Meta:model models.PrettyNum# fields [mobiles,price,level,status] 一一列举# exclude [level] 排除fields __all__def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件添加了class:form-control得样式for name, field in self.fields.items():print(name, field)field.widget.attrs {class: form-control, placeholder: field.label}# # # 验证方法2钩子方法对用户数据进行验证
# def clean_mobile(self):
# txt_mobile self.cleaned_data[mobile]
# if len(txt_mobile) !11:
# raise ValidationError(手机号格式错误)
# return txt_mobile #views.py
def pretty_add(request):if request.method GET:form PrettyModelForm()return render(request, pretty_add.html, {form: form})row_object models.PrettyNum.objects.create()form PrettyModelForm(datarequest.POST, instancerow_object)if form.is_valid():form.save()return redirect(/pretty/list)return render(request, pretty_add.html, {form: form})
编辑靓号 views.py文件下重新定义PrettyEditModelForm 其中mobile forms.CharField(disabledTrue,label“手机号”)表示在编辑时“手机号”显示但不可更改
#ModelForm类
from django import formsclass PrettyEditModelForm(forms.ModelForm):mobile forms.CharField(disabledTrue,label手机号)class Meta:model models.PrettyNum# fields [mobiles,price,level,status] 一一列举# exclude [level] 排除fields __all__def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件添加了class:form-control得样式for name, field in self.fields.items():print(name, field)field.widget.attrs {class: form-control, placeholder: field.label}
确保编辑的手机号在原数据中没有重复。编辑对象的idself.instance.pkdef clean_mobile(self):#print(self.instance.pk)txt_mobile self.cleaned_data[mobile]existsmodels.PrettyNum.objects.exclude(idself.instance.pk).filter(mobiletxt_mobile).exists()if exists:raise ValidationError(手机号已存在)#if len(txt_mobile) !11:#raise ValidationError(手机号格式错误)return txt_mobile#views.py
def pretty_edit(request, nid):row_object models.PrettyNum.objects.filter(idnid).first()if request.method GET:form PrettyEditModelForm(instancerow_object)return render(request, pretty_edit.html, {form: form})form PrettyEditModelForm(datarequest.POST, instancerow_object)if form.is_valid():form.save()return redirect(/pretty/list)return render(request, pretty_edit.html, {form: form}) 删除靓号
def pretty_delete(request, nid):models.PrettyNum.objects.filter(idnid).delete()return redirect(/pretty/list/)搜索靓号 get方式传参q pretty_list.html页面添加一个搜索框name“q”,submit提交
div classcol-lg-3 clearfix stylefloat: right;display: blockform methodgetdiv classinput-groupspan classinput-group-btnbutton classbtn btn-default typesubmitspan classglyphicon glyphicon-zoom-in aria-hiddentrue/span/button/spaninput typetext nameq classform-control placeholderSearch for...value{{ search_data }}/div!-- /input-group --/form在靓号列表views.py中添加 data_dict {} search_data request.GET.get(‘q’, “”) if search_data: data_dict[“mobile__contains”] search_data queryset models.PrettyNum.objects.filter(**data_dict).order_by(“-level”)
靓号列表
def pretty_list(request):data_dict {}search_data request.GET.get(q, )if search_data:data_dict[mobile__contains] search_dataqueryset models.PrettyNum.objects.filter(**data_dict).order_by(-level)page_object Pagination(request, queryset) # 分页context {queryset: page_object.page_queryset,search_data: search_data, # 分完页的数据page_string: page_object.html() # 页码}return render(request, pretty_list.html, context)
models.PrettyNum.objects.filter(mobile1612313223,id7)
data_lict {mobile:168324145,id:7}
models.PrettyNum.objects.filter(**data_lict)models.PrettyNum.objects.filter(mobile__contains”1999”)
#对于数字类型
#filter(id12) #等于12
#filter(id__gt12) #大于12
#filter(id__gte12) #大于等于12
#filter(id__lt12) #小于12
#filter(id__lte12) #小于等于12
#filter(id12)
#对于字符串类型
#filter(mobile”1999”)
#filter(mobile__startswith”1999”) #筛选1999开头
#filter(mobile__endswith”1999”)
#filter(mobile__contains”1999”)五、自定义分页组件
4.分页组件的创建 在appo01目录下创建utils目录并创建pagination.py文件 自定义分页组件 from django.utils.safestring import mark_safe
class Pagination(object):def __init__(self,request,queryset,page_size10,page_parampage,plus5)::param request: 请求对象:param queryset: 符合条件的数据:param page_size: 每页显示多少条数据:param page_param: 在URL中传递的获取分页的参数 例如/pretty/list/?page4:param plus:显示当前页的前或后几页页码import copyquery_dict copy.deepcopy(request.GET)query_dict._mutable Trueself.query_dict query_dictpage request.GET.get(page_param, 1)if page.isdecimal():pageint(page)else:page1self.page pageself.page_sizepage_sizeself.page_parampage_paramself.start (page - 1) * page_sizeself.end page * page_sizeself.page_queryset queryset[self.start:self.end]total_count queryset.count()total_page_count, div divmod(total_count, page_size)if div:total_page_count 1self.total_page_count total_page_countself.plusplusdef html(self):# 计算出显示当前页的的前五页后五页# 数据较少显示全部页码if self.total_page_count 2 * self.plus 1:start_page 1end_page self.total_page_countelse:# 数据较多# 当前页5if self.page self.plus:start_page 1end_page 2 * self.plus 1else:# 当前页5# 当前页5总页面if (self.page self.plus) self.total_page_count:start_page self.total_page_count - 2 * self.plusend_page self.total_page_countelse:start_page self.page - self.plusend_page self.page self.plus# 页码page_str_list []self.query_dict.setlist(self.page_param,[1])first lia href?{}首页/a/li.format(self.query_dict.urlencode())page_str_list.append(first)# 上一页if self.page 1:self.query_dict.setlist(self.page_param,[self.page-1])prev lia href?{}《/a/li.format(self.query_dict.urlencode())else:prev lia href?{}《/a/li.format(1)page_str_list.append(prev)for i in range(start_page, end_page 1):self.query_dict.setlist(self.page_param,[i])if i self.page:ele li classactivea href?{}{}/a/li.format(self.query_dict.urlencode(), i)else:ele lia href?{}{}/a/li.format(self.query_dict.urlencode(), i)page_str_list.append(ele)if self.page self.total_page_count:self.query_dict.setlist(self.page_param,[self.page1])next lia href?{}》/a/li.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param,[self.total_page_count])next lia href?{}》/a/li.format(self.query_dict.urlencode())page_str_list.append(next)# 尾页self.query_dict.setlist(self.page_param,[self.total_page_count])end lia href?{}尾页/a/li.format(self.query_dict.urlencode())page_str_list.append(end)search_string li form methodget stylefloat: leftinput typetext classform-control namepage placeholder页码 stylewidth: 80px;position: relative;float: left;display: inline-block;border-radius: 0button typesubmit classbtn btn-default跳转/button/form/lipage_str_list.append(search_string)page_string mark_safe(.join(page_str_list))return page_string注意
如果以后想要使用这个分页组件你需要做如下几件事在视图函数views.py函数中
def pretty_list(request):#1.根据所需筛选数据queryset models.PrettyNum.objects.all()
#2.实例化分页对象page_object Pagination(request,queryset,page_size2)context {queryset: page_object.page_queryset, #分完页的数据page_string: page_object.html() #生成页码}return render(request, pretty_list.html,context)在html页面中ul classpagination{{ page_string }}/ul靓号列表pretty_list views.py文件如上,需要提前导入 from app01.utils.pagination import Pagination pretty_list.html文件
{% extends layout.html %}{% block content %}div classcontainerdiv classpanel panel-default !-- Default panel contents --div classpanel-heading a classbtn btn-success btn-xs href/pretty/add/span classglyphicon glyphicon-plus aria-hiddentrue/span添加靓号/adiv classcol-lg-3 stylefloat: right;display: block;padding-bottom: 5pxform methodgetdiv classinput-groupspan classinput-group-btnbutton classbtn btn-default typesubmitspan classglyphicon glyphicon-zoom-in aria-hiddentrue/span/button/spaninput typetextnameq classform-control placeholderSearch for...value{{ search_data }}/div!-- /input-group --/form/div/div!-- Table --table classtabletheadtrthid/thth电话号/thth单价/thth级别/thth状态/thth操作/th/tr/theadtbody{% for obj in queryset %}trth scoperow{{ obj.id }}/thtd{{ obj.mobile }}/tdtd{{ obj.price }}/tdtd{{ obj.get_level_display }}/tdtd{{ obj.get_status_display }}/tdtda href/pretty/{{ obj.id }}/edit/ classbtn btn-primary btn-xs 编辑/aa href/pretty/{{ obj.id }}/delete/ classbtn btn-danger btn-xs 删除/a/td/tr{% endfor %}/tbody/table/divdivnavul classpagination{{ page_string }}/ul/nav/div/div!-- /.container --{% endblock %}六、datepick时间插件的使用
在layout.html模板文件中引入datepick的js、css
script srchttps://cdn.jsdelivr.net/npm/bootstrap-datepicker1.10.0/dist/js/bootstrap-datepicker.min.js/scriptscript srchttps://cdn.jsdelivr.net/npm/bootstrap-datepicker1.10.0/dist/js/bootstrap-datepicker.min.js/script1.直接在字段中添加 id“dt”
script$(function (){$(#dt).datepicker({format:yyyy-mm-dd,startDate:0,language:zh-CN.js:6,autoclose:true});})
/script2.基于ModelForm
#id_字段名id_creat_time
script$(function (){$(#id_creat_time).datepicker({format:yyyy-mm-dd,startDate:0,language:zh-CN.js:6,autoclose:true});})/script七、自定义有Bootstrap样式的ModelForm
在appo01目录下创建utils目录并创建bootstrap.py文件
from django import formsclass BootstrapModelForm(forms.ModelForm):bootstrap_exclude_fields [img]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件添加了class:form-control得样式for name, field in self.fields.items():if name in self.bootstrap_exclude_fields:continue# 字段中有属性保留原来的属性没有属性才增加if field.widget.attrs:# 有则添加字典值field.widget.attrs[class] form-controlfield.widget.attrs[placeholder] field.labelelse:field.widget.attrs {class: form-control,placeholder: field.label}
继承BootstrapModelForm并定义class Meta
class UserEditModelForm(BootstrapModelForm):class Meta:model models.UserInfofields [name, password, age]注意需要提前引用
from app01.utils.bootstrap import BootstrapModelForm