django.forms生成HTML,django为Form生成的label标签添加class

django为Form生成的label标签添加class

原创

骑士救兵2018-05-25 12:54:41著作权

文章分类

python自动化开发问题集

阅读数

21059

©著作权归作者所有:来自51CTO博客作者骑士救兵的原创作品,如需转载,请注明出处,否则将追究法律责任

https://blog.51cto.com/steed/2120211

使用Form生成html标签的时候,虽然提供了widget的方法可以自定义标签的要是,但是只能给生成的input标签添加样式,对于生成的label标签无法添加样式。而很多场景下需要为label和input都添加class以实现自定义样式。

# 测试环境

创建一个Form,通过Form帮我们生成HTML:

```python

# 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帮我生成的表单:

```html

{{ 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 }}` 无法传入参数。这里就自定义个模板语言的函数来解决这个问题。

## 自定义函数

要自定义函数,按照下面的步骤操作:

1. 在APP下,创建templatetags目录,目录名字很重要不能错。

2. 创建任意 .py 文件,这里文件名随意,比如:myfun.py。

3. 文件里创建一个template.Library()对象,名字是register。这里的对象名字必须是register。

4. 然后写自己的函数,但是都用@register.simple_tag这个装饰器装饰好:

自定义的函数如下:

```python

# 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})

```

然后在页面中使用自定义的函数:

```html

{{ 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()。照着样子再写一个子定义函数:

```python

# 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循环,就能把表单按自定义的样式显示出来:

```html

{% load myfun %}

{% for item in obj %}

{{ item|label_with_classes:'col-sm-2 control-label' }}

{{ item|widget_with_classes:'form-control' }}

{% endfor %}

```

1赞

1收藏

评论

Django FormsDjango框架中的重要组件,用于处理Web应用程序中的表单数据。它提供了一种简单而强大的方式来定义、验证和渲染表单。 Django Forms的主要特点包括: 1. 表单字段:Django Forms提供了各种字段类型,如文本字段、整数字段、日期字段等,用于定义表单中的各个输入项。 2. 表单验证:通过在表单字段上定义验证规则,Django Forms可以自动验证用户提交的数据,并提供错误提示信息。 3. 表单渲染:Django Forms可以自动将表单字段渲染为HTML表单元素,简化了前端开发的工作。 4. 表单处理:Django Forms可以处理用户提交的表单数据,并将其转换为Python对象,方便在后端进行处理和存储。 使用Django Forms的基本步骤如下: 1. 定义表单类:通过继承`django.forms.Form`类,定义一个表单类,并在其中定义各个表单字段。 2. 渲染表单:在视图函数中创建表单实例,并将其传递给模板进行渲染,生成HTML表单元素。 3. 处理表单数据:在视图函数中接收用户提交的表单数据,并进行验证和处理。 下面是一个简单的示例代码,展示了如何使用Django Forms: ```python # forms.py from django import forms class LoginForm(forms.Form): username = forms.CharField(label='用户名') password = forms.CharField(label='密码', widget=forms.PasswordInput) # views.py from django.shortcuts import render from .forms import LoginForm def login(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): # 处理表单数据 username = form.cleaned_data['username'] password = form.cleaned_data['password'] # 其他逻辑处理 else: form = LoginForm() return render(request, 'login.html', {'form': form}) # login.html <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值