python编译成class_django为Form生成的label标签添加class方式
使用Form生成html标签的时候,虽然提供了widget的方法可以自定义标签的要是,但是只能给生成的input标签添加样式,对于生成的label标签无法添加样式。
而很多场景下需要为label和input都添加class以实现自定义样式。
测试环境
创建一个Form,通过Form帮我们生成HTML:
# urls.py 文件,对应关系
path('email/', views.email),
# forms.py 文件
from django.forms import Form
from django.forms import fields
from django.forms import widgets
class UserEmail(Form):
username = fields.CharField()
password = fields.CharField(
widget=widgets.PasswordInput(attrs={'class': 'c1'})
)
email = fields.EmailField(
widget=widgets.EmailInput(attrs={'class': 'c1'})
)
# views.py 文件
def email(request):
obj = forms.UserEmail()
print(obj['email'].label_tag(attrs={'class': 'c1'})) # 其实生成标签的方法是提供attrs参数的
return render(request, 'demo/email.html', {'obj': obj})
在html中,直接使用Form帮我生成的表单:
{{ obj.as_p }}
{{ obj.email.label_tag }}
{{ obj.email }}
这里可以看到,input标签里都是有class属性的,但是lable标签里没有,并且Form组件里貌似也没有提供为label标签增加自定义属性的方式。
通过模板语言的自定义函数实现
上面的views里的 print(obj['email'].label_tag(attrs={'class': 'c1'})) ,从输出看,django提供的生成label标签的方法是支持attrs参数实现自定义属性的,问题是在前端使用模板语言的时候只能这样 {{ obj.email.label_tag }} 无法传入参数。这里就自定义个模板语言的函数来解决这个问题。
自定义函数
要自定义函数,按照下面的步骤操作:
在APP下,创建templatetags目录,目录名字很重要不能错。
创建任意 .py 文件,这里文件名随意,比如:myfun.py。
文件里创建一个template.Library()对象,名字是register。这里的对象名字必须是register。
然后写自己的函数,但是都用@register.simple_tag这个装饰器装饰好:
自定义的函数如下:
# app名/templatetags/myfun.py 文件
from django import template
register = template.Library()
@register.filter(is_safe=True)
def label_with_classes(value, arg):
return value.label_tag(attrs={'class': arg})
然后在页面中使用自定义的函数:
{{ obj.as_p }}
{{ obj.email.label_tag }}
{{ obj.email }}
{% load myfun %}
{{ obj.email|label_with_classes:'c1 c2' }}
注意,上面的自定义函数引用的时候参数和参数之间一定不能有空格。
这里还有一个好处,把添加前端样式的代码放到了前端的html里实现了。
为input标签也写一个自定义函数
django默认的方法是在Form里,通过widgets小部件添加attrs参数来实现标签的自定义样式。这是在放在后端实现的。上面已经实现了前端的自定义样式,这里找了到生成input标签的方法,就是as_widget()。
照着样子再写一个子定义函数:
# app名/templatetags/myfun.py 文件
from django import template
register = template.Library()
@register.filter()
def label_with_classes(value, arg):
return value.label_tag(attrs={'class': arg})
@register.filter()
def widget_with_classes(value, arg):
return value.as_widget(attrs={'class': arg})
最后,上面搞得难么麻烦,主要是为了可以前端一个for循环,就能把表单按自定义的样式显示出来:
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
{% load myfun %}
{% for item in obj %}
{{ item|label_with_classes:'col-sm-2 control-label' }}
{{ item|widget_with_classes:'form-control' }}
{% endfor %}
补充知识:Django Forms组件 的参数配置案例 input样式, 渲染的标签加class 错误信息提示
Forms渲染出标签类型
密码型、文本型、邮箱型框
from django.forms import widgets
# 自定义格式方法
class UserForm(forms.Form):
'''最小4位 且 模式:普通文本'''
name = forms.CharField(min_length=4, label='姓名:',widget=widgets.TextInput())
'''最小4位 且 模式:密码模式'''
pwd = forms.CharField(min_length=4, label='密码:', widget=widgets.PasswordInput())
渲染时添加属性 class=''(便于bootstrap)
from django.forms import widgets
'''在widgets.类型(加入字典形式的标签信息)'''
class UserForm(forms.Form):
# 模式:普通文本 标签加上:class="form-control"
name = forms.CharField(widget=widgets.TextInput(attrs={'class': 'form-control'}))
# 模式:密码模式 标签加上:class="form-control"
pwd = forms.CharField(widget=widgets.PasswordInput(
attrs={'class': 'form-control'}
))
渲染自定义错误提示
视图
from django.forms import widgets
'''追加error_messages参数 dict型式'''
class UserForm(forms.Form):
# 模式:required=不能为空的提示
name = forms.CharField(min_length=4, label='姓名:',
error_messages={
'title': {'required': '不能为空哦亲亲'},
'price': {'invalid': '格式错误(提示方法)'},
# '字段': {'错误类型': '提示信息'}
})
# 模式:invalid=格式错误
pwd = forms.CharField(min_length=4, label='密码:',
error_messages={
'title': {'required': '不能为空哦亲亲'},
'price': {'invalid': '格式错误(提示方法)'},
# '字段': {'错误类型': '提示信息'}
})
HTML展示错误信息
{% csrf_token %}
{% for field in form %}
{{ field.label }}{{ field }} {{ field.errors.0 }}
{% endfor %}
以上这篇django为Form生成的label标签添加class方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
本文标题: django为Form生成的label标签添加class方式
本文地址: http://www.cppcns.com/jiaoben/python/313830.html
python编译成class_django为Form生成的label标签添加class方式相关推荐
- 什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件
文章目录 1 什么是pyc文件 1.1 什么是pyc文件 1.2 pyc文件是怎么生成的,有什么好处 2 把python的py文件编译成pyc文件 2.1 使用python内置库py_compile把 ...
- python编译成exe有意义吗_python工程编译成EXE
前言 python编译成EXE文件后,可以独立使用.亲测,一个复杂的python工程包含多个包多个模块,可以生成exe文件. 目的 windows下将整个python工程编译成单个EXE或者单个目录带 ...
- python编译成exe和exe反编译成python
先看文章概要.再看左侧目录,可准确找到需要内容 文章概要:python文件可编译成exe文件,exe文件也可通过反编译恢复为python文件.下面简单介绍如何生成exe和恢复python python ...
- antd-vue中的form表单label标签for导致点击文字触发输入框解决方案
antd-vue中的form表单label标签for导致点击文字触发输入框解决方案 参考文章: (1)antd-vue中的form表单label标签for导致点击文字触发输入框解决方案 (2)http ...
- python编译成exe速度会变快吗_python如何编译成exe
Python 程序都是脚本的方式,一般是在解析器里运行,如果要发布出去,需要提前安装解析器才可以运行,为了在 Windows 里方便发布,只要点击一个 EXE 文件运行,并且打包所需要库文件,这样发布 ...
- Python编译成C语言,性能有多暴力?
我这里用的Python环境是Anaconda3 2019.7 这里测试的程序是找出所有1000以内的勾股数. a∈[1, 1000],b∈[1, 1000], c∈[1, 1000] 满足a² + b ...
- python编译成c代码_python如何调用c编译好可执行程序
以下总结出几种在Python 中调用 C/C++ 代码的方法 -------------------------------------------------------------------- ...
- 『Python』Python编译成计算机可执行文件(Windows计算机可执行文件exe,Linux 计算机可执行文件elf,Mac计算机可执行文件mach-O)
文章目录 背景: 我们的主角 :PyInstaller 使用 1.安装pyinstaller 2.进入安装工作环境 3. 生成不自定义图标的exe文件 4.生成带自定义图标的exe文件 PyInsta ...
- Python编译成.so文件后调用
1. 环境准备 思路是先将py转换为c代码,然后编译c为so文件,所以要安装以下内容: pip install cython sudo apt-get install python-devel sud ...
最新文章
- Nacos 集群部署模式最佳实践
- pycharm专业版-2017.3.3 安装+anaconda3-2019.03-windows
- Golang 正在成为互联网大厂的主流编程语言!
- 文献学习(part88)--Graph Learning for Multiview Clustering
- mapbox 导航_狂甩不掉,骑行最稳手机支架!一体式安装太方便,秒变单车导航仪...
- dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入
- Vue 2.0 + Axios + Vue Router 实现CNode社区
- Project Management-软件开发之项目管理
- WSDM2019|门限注意力自编码在内容感知推荐中的应用(已开源)
- Marshmallow 实现序列化和反序列化
- 联想小新13pro安装ubuntu双系统心得(解决无法识别启动U盘等问题)
- Android判断用户是否已完成设置向导(开机向导)
- java中宏定义,宏定义的使用
- Kubernetes 学习笔记
- Fedora10下AMD,Nvidia,Intel显卡驱动安装指南
- FATE —— 二.3.2 Hetero-NN使用CustModel设置顶部、底部模型
- 20实际最牛逼的10大算法
- 汇编语言程序设计——仿win7计算器(功能部分)
- 浅谈标签传播算法:LPA
- 深圳软件测试 黑盒测试,深圳软件测试培训:常用控件黑盒测试方法有哪些?...