使用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方式相关推荐

  1. 什么是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把 ...

  2. python编译成exe有意义吗_python工程编译成EXE

    前言 python编译成EXE文件后,可以独立使用.亲测,一个复杂的python工程包含多个包多个模块,可以生成exe文件. 目的 windows下将整个python工程编译成单个EXE或者单个目录带 ...

  3. python编译成exe和exe反编译成python

    先看文章概要.再看左侧目录,可准确找到需要内容 文章概要:python文件可编译成exe文件,exe文件也可通过反编译恢复为python文件.下面简单介绍如何生成exe和恢复python python ...

  4. antd-vue中的form表单label标签for导致点击文字触发输入框解决方案

    antd-vue中的form表单label标签for导致点击文字触发输入框解决方案 参考文章: (1)antd-vue中的form表单label标签for导致点击文字触发输入框解决方案 (2)http ...

  5. python编译成exe速度会变快吗_python如何编译成exe

    Python 程序都是脚本的方式,一般是在解析器里运行,如果要发布出去,需要提前安装解析器才可以运行,为了在 Windows 里方便发布,只要点击一个 EXE 文件运行,并且打包所需要库文件,这样发布 ...

  6. Python编译成C语言,性能有多暴力?

    我这里用的Python环境是Anaconda3 2019.7 这里测试的程序是找出所有1000以内的勾股数. a∈[1, 1000],b∈[1, 1000], c∈[1, 1000] 满足a² + b ...

  7. python编译成c代码_python如何调用c编译好可执行程序

    以下总结出几种在Python 中调用 C/C++ 代码的方法 -------------------------------------------------------------------- ...

  8. 『Python』Python编译成计算机可执行文件(Windows计算机可执行文件exe,Linux 计算机可执行文件elf,Mac计算机可执行文件mach-O)

    文章目录 背景: 我们的主角 :PyInstaller 使用 1.安装pyinstaller 2.进入安装工作环境 3. 生成不自定义图标的exe文件 4.生成带自定义图标的exe文件 PyInsta ...

  9. Python编译成.so文件后调用

    1. 环境准备 思路是先将py转换为c代码,然后编译c为so文件,所以要安装以下内容: pip install cython sudo apt-get install python-devel sud ...

最新文章

  1. Nacos 集群部署模式最佳实践
  2. pycharm专业版-2017.3.3 安装+anaconda3-2019.03-windows
  3. Golang 正在成为互联网大厂的主流编程语言!
  4. 文献学习(part88)--Graph Learning for Multiview Clustering
  5. mapbox 导航_狂甩不掉,骑行最稳手机支架!一体式安装太方便,秒变单车导航仪...
  6. dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入
  7. Vue 2.0 + Axios + Vue Router 实现CNode社区
  8. Project Management-软件开发之项目管理
  9. WSDM2019|门限注意力自编码在内容感知推荐中的应用(已开源)
  10. Marshmallow 实现序列化和反序列化
  11. 联想小新13pro安装ubuntu双系统心得(解决无法识别启动U盘等问题)
  12. Android判断用户是否已完成设置向导(开机向导)
  13. java中宏定义,宏定义的使用
  14. Kubernetes 学习笔记
  15. Fedora10下AMD,Nvidia,Intel显卡驱动安装指南
  16. FATE —— 二.3.2 Hetero-NN使用CustModel设置顶部、底部模型
  17. 20实际最牛逼的10大算法
  18. 汇编语言程序设计——仿win7计算器(功能部分)
  19. 浅谈标签传播算法:LPA
  20. 深圳软件测试 黑盒测试,深圳软件测试培训:常用控件黑盒测试方法有哪些?...

热门文章

  1. 《直播疑难杂症排查系列》之一 :播放失败
  2. 找到比某个数大的最小的2的次幂
  3. df -h 显示100%的解决办法
  4. Rowkey设计_HBase表设计
  5. 使用cloudera manager安装Hive服务【详细步骤】
  6. 可关闭的浮动div示例
  7. 【Java类加载机制】深入加载器
  8. Java学习笔记十五
  9. Leet Code OJ 206. Reverse Linked List [Difficulty: Easy]
  10. linux开机自动启动数据库,mysql随linux开机自动启动