亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

django為Form生成的label標簽添加class方式

瀏覽:9日期:2024-10-02 13:57:37

使用Form生成html標簽的時候,雖然提供了widget的方法可以自定義標簽的要是,但是只能給生成的input標簽添加樣式,對于生成的label標簽無法添加樣式。

而很多場景下需要為label和input都添加class以實現自定義樣式。

測試環境

創建一個Form,通過Form幫我們生成HTML:

# urls.py 文件,對應關系 path(’email/’, views.email), # forms.py 文件from django.forms import Formfrom django.forms import fieldsfrom 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幫我生成的表單:

<body>{{ obj.as_p }}{{ obj.email.label_tag }}{{ obj.email }}</body>

這里可以看到,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 templateregister = template.Library() @register.filter(is_safe=True)def label_with_classes(value, arg): return value.label_tag(attrs={’class’: arg})

然后在頁面中使用自定義的函數:

<body>{{ obj.as_p }}{{ obj.email.label_tag }}{{ obj.email }}{% load myfun %}{{ obj.email|label_with_classes:’c1 c2’ }}</body>

注意,上面的自定義函數引用的時候參數和參數之間一定不能有空格。

這里還有一個好處,把添加前端樣式的代碼放到了前端的html里實現了。

為input標簽也寫一個自定義函數

django默認的方法是在Form里,通過widgets小部件添加attrs參數來實現標簽的自定義樣式。這是在放在后端實現的。上面已經實現了前端的自定義樣式,這里找了到生成input標簽的方法,就是as_widget()。

照著樣子再寫一個子定義函數:

# app名/templatetags/myfun.py 文件from django import templateregister = 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循環,就能把表單按自定義的樣式顯示出來:

<body><link rel='stylesheet' rel='external nofollow' integrity='sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u' crossorigin='anonymous'>{% load myfun %}<form class='form-horizontal'>{% for item in obj %} <div class='form-group'> {{ item|label_with_classes:’col-sm-2 control-label’ }} <div class='col-sm-10'> {{ item|widget_with_classes:’form-control’ }} </div> </div>{% endfor %}</form></body>

補充知識: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): # 模式:普通文本 標簽加上: name = forms.CharField(widget=widgets.TextInput(attrs={’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展示錯誤信息

<form action='' method='post' novalidate='novalidate'> <!--要自定義提示必須 novalidate='novalidate'--> {% csrf_token %} {% for field in form %} <p> {{ field.label }}{{ field }} <span>{{ field.errors.0 }}</span> <!--錯誤信息固定:field.errors.0 --> </p> {% endfor %} <p><input type='submit' value='提交'></p> </form>

以上這篇django為Form生成的label標簽添加class方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 国产色a| 尹人香蕉久久99天天拍欧美p7 | 一级s片| 国产自产自拍 | 二级特黄绝大片免费视频大片 | 日本一级毛片 | 日韩黄色录像 | 久久久高清国产999尤物 | 亚洲精品国产三级在线观看 | 好吊色青青青国产欧美日韩 | 欧美日韩亚洲一区二区 | 色一情一伦一区二区三 | 国产一区二区三区免费视频 | 国产精品久久久久久久网站 | 人妖与黑人做爰 | 1769国内精品视频在线观看 | 欧美成人全部免费观看1314色 | 中文字幕极速在线观看 | 我想看黄色毛片 | 嫩草成人永久免费观看 | 手机黄色小视频 | 国产女人久久精品 | 成人啪 | 欧美成人性生活视频 | 成人国产精品高清在线观看 | 欧美三级成人 | 久久成人国产精品 | 看真人一一级毛片 | 午夜精品久久久久久久久 | 99久国产| 欧美激情一区二区 | 国产九色| 女猛烈无遮挡性视频免费 | 在线看的毛片 | 久久免费99精品久久久久久 | 亚洲精品国产精品国自产 | 国产精品69白浆在线观看免费 | 国语三级 | 亚洲欧美日韩高清 | 正在播放国产无套露脸 | 晚上睡不着偷偷看b站免费是视频 |