ModelForm 或者 Form组件的作用:

  1. 生成HTML标签
  2. 对POST过来的表单数据进行验证
  3. 直接将数据保存到数据库
  4. 获取表单错误信息

Django的管道操作

模板时间格式化显示

{{item.event_start|date:“Y-m-d H:i:s”}}
{{bio|truncatewords:“30”}}
{{my_list|first|upper}}
{{name|lower}}

Mysql时间转Python时间字符串

obj.create_time.strftime("%Y-%m-%d  %H:%M:%S"))

在模板中调用方法是不能加()的, 模板会自动帮我们添加.

models中,建立自定义枚举类的约束到数据库

gender_choices = ((1, "男"),(2, "女"),)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

python中获取Model中自定义的Enum名称,调用对应的get_gender_display()方法

obj.get_gender_display()

模板中调用该方法获取Enum名称时,不可以加()

{{ i.get_gender_display }}

ModelForm生成页面

本节中包含ModelForm字段中批量添加BootStrap5.1的实现,可以单独提取出来封装成一个类,配合BootStrap5.1一起使用

views中

class UserModelForm(ModelForm):# 自定义校验规则, 不自定义会启用默认校验规则name = forms.CharField(min_length=3, label="用户名")# password = forms.CharField(label="密码", validators='正则')# 删除时间输入框的浏览器自动提示 方式1# create_time = forms.DateTimeField(label="入职时间", widget=forms.DateTimeInput(attrs={#     'autocomplete': 'off'# }))  # 自动生成html页面标签class Meta:model = UserInfofields = ["name", "password", 'age', "account", "create_time", "gender", "depart"]# 循环找到所有的控件, 添加类名def __init__(self, *args, **kwargs):super(UserModelForm, self).__init__(*args, **kwargs)        for name, field in self.fields.items():# name 字段名# field 字段对应的对象# 字段中有属性,保留原来的属性,没有属性,才增加if field.widget.attrs:field.widget.attrs['class'] = 'form-control'field.widget.attrs['placeholder'] = field.labelelse:field.widget.attrs = {"class": "form-control", "placeholder": field.label}# 如果是时间输入,屏蔽掉浏览器自带的输入提示,方便DateTimePicker的显示if name == "create_time":field.widget.attrs['autocomplete'] = 'off'def user_mode_form_add(request):""" 添加用户 (ModelForm版本)"""form = UserModelForm()return render(request, "app01/user_model_form_add.html", locals())def user_mode_form_add(request):# 用户POST提交数据,数据校验form = UserModelForm(data=request.POST)if form.is_valid():# 校验成功,入库# print(form.cleaned_data)# 自动入库form.save()return redirect("/user/list/")# 验证失败 ,页面显示错误信息print(form.errors)return render(request, "app01/user_model_form_add.html", locals())

templates中
其中DateTimePicker不是关注点, 文中忽略
模板中直接调用form中的field,对于字段是外键的,如果不做任何处理,返回的是对象类型.

<form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="mb-3">{# ModelForm类自动生成面页标签和面页控件 #}<label for="name" class="form-label">{{ field.label }}</label>{{ field }}<span style="color:red;">{{ field.errors.0 }} </span>{# [error1 error2] #}</div>{% endfor %}<button type="submit" class="btn btn-primary btn-sm">保存</button>
</form>

解决ModelForm返回外键引用的对象的问题.

models中

class Department(models.Model):# 部门表title = models.CharField(verbose_name="部门名称", max_length=32)def __str__(self):# 解决ModelForm的外键引用返回对象的问题.return self.title

MD5加密

对于密码输入框的加密处理
自定义一个模块
用md5加密,再加上django自带的盐

import hashlib
from django.conf import settingsdef md5(data_string):salt = settings.SECRET_KEYobj = hashlib.md5(salt.encode("utf-8"))obj.update(data_string.encode("utf-8"))return obj.hexdigest()

用钩子方法对密码校验和提交前的校验

在views中

class AdminModelForm(BootStrapModelForm):# 数据表中没有,但是我们需要添加一个字段的处理方式confirm_password = forms.CharField(label="确认密码",# render_value=True,密码错误的时候页不会清空输入框widget=forms.PasswordInput(render_value=True))class Meta:model = Adminfields = "__all__"widgets = {"password": forms.PasswordInput}# 定义钩子方法 在数据提交到数据库前的操作def clean_password(self):pwd = self.cleaned_data.get("password")return md5(pwd)# 勾到confirm_password字段上def clean_confirm_password(self):# print(self.cleaned_data)pwd = self.cleaned_data.get("password")confirm = self.cleaned_data.get("confirm_password")confirm = md5(confirm)if pwd != confirm:# 抛自定义的异常raise ValidationError("密码不一致")# 如果不抛异常,就会直接return confirm这个值, 并且通过form.save()入库return confirm

利用Form主动添加一个错误

在做密码验证的时候,如果用户名或者密码错误,可以通过向form中主动添加错误的方式来提示用户
在views中

 exists = Admin.objects.filter(**form.cleaned_data).exists()if exists:return redirect("/admin/list/")else:# 主动在form中显示一个错误form.add_error("password", "用户名或者密码错误")return render(request, "app01/login.html", locals())

用Ajax发送post请求时,避免跨域问题的方法

在views中,函数前添加一个装饰器

@csrf_exempt
def task_ajax(request):print(request.POST)return HttpResponse("不刷页面发送请求")

Django模板语法和ModelForm相关推荐

  1. 【小程序】小程序起步、WXML模板语法和WXSS模板样式

    文章目录 一.小程序-起步 1.1 小程序和普通网页开发的不同 1.2 项目的基本组成部分 1.3 小程序的宿主环境 1.3.1 通信模型 1.3.2 运行机制 1.3.3 常用的视图容器类组件vie ...

  2. Django模板系统和admin模块

    只需要记两种特殊符号:{{ }}和 {% %}变量相关的用 {{}}, 逻辑相关的用 {%%}. Filters 语法: {{ value|filter_name:参数 }}default{{ val ...

  3. django模板过滤器

    django模板&过滤器 声明:部分信息来源这篇博客https://www.cnblogs.com/maple-shaw/articles/9333821.html MVC: 模型(model ...

  4. python django 模板

    1 用两个大括号括起来的文字{{person_name}} 称为变量 2 被 大括号和面分号包围的文件({% if ordered_warranty %})是模板标签 3 过滤器是用管道符(|) 和U ...

  5. Django模板语言

    常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含义, ...

  6. Django - 模板相关

    一.MVC和MTV 1. MVC M: Model : 数据库, 存取数据 V: View: 视图, 信息的展示 C: Controller: 控制器, 逻辑的控制, 负责调度, 传递指令 2. MT ...

  7. django模板系统(上)

    filters 过滤 default 替代作用 filesizeformat 格式化为人类可读 add 给变量加参数 lower 小写 upper 大写 title 标题 ljust 左对齐 rjus ...

  8. Django中的Form ModelForm

    Django中的Form & ModelForm 在web开发中,处理表单是家常便饭,我们当然可以直接在模板中编写原生的html表单,然后在后端进行表单验证,这常常是一项繁琐的工作. Form ...

  9. Django模板语言相关内容

    Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言 ...

  10. Django 模板系统

    Django模板系统 常用语法 {{}} 变量相关 {%%} 逻辑相关 变量 格式 {{ 变量名 }} 命名规则 包括任何字母数字以及下划线 ("_")的组合 变量名称中不能有空格 ...

最新文章

  1. 【MySQL】面试官:如何添加新数据库到MySQL主从复制环境?
  2. JSP显示错误信息中四个范围来保存变量
  3. python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
  4. 关于 Service 设计初步(MSDN节选翻译)
  5. OpenJudge NOI 1.7 08:字符替换
  6. 知识图谱在招聘推荐匹配的应用
  7. java终结方法_java编程思想之并发(终结任务)
  8. bzoj3670 [Noi2014]动物园
  9. 最全的Redis安装教程
  10. LGame-0.3(Android与JavaSE游戏引擎)正式发布,新增SRPG制作模块
  11. 使用vue-giant-tree根据id定位位置
  12. Poco库使用:文件压缩和解压缩
  13. chrome安装插件的方法
  14. Oracle发布Oracle Enterprise Manager 12c
  15. pandas算加权平均值_python – groupby加权平均值和pandas数据帧中的和
  16. windows10安装配置vim
  17. 无抵押贷款 幸福生活新选择
  18. .hpp文件和.h文件的区别
  19. Java后台下载Excel模板并输出到浏览器上的样例
  20. CA-MKD:置信多教师知识蒸馏

热门文章

  1. 虚拟主机和云服务器有什么区别,我们应该如何选择?
  2. Spring Boot日志格式化JSON方案
  3. Windows问题记录之任务栏图标透明
  4. CF#552div3题解
  5. R9000P2021版拯救者 装ubuntu系统相关问题(WiFi、蓝牙、亮度调节,驱动安装)记录总结
  6. 超详细Redis使用手册
  7. 科宇扫地机器人_扫地谁更精准更干净?新一代3D视讯+激光成像 PK 老式激光扫描...
  8. 水库大坝安全监测系统解决方案
  9. 移动硬盘安装linux,thinkpad sl400笔记本安装vista,双系统
  10. android定义键盘示例(斗地主或跑得快的记牌器)