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を使ってフォームを作成してください。

<body>
{{ obj.as_p }}
{{ obj.email.label_tag }}
{{ obj.email }}
</body>
ここで見ることができます。inputタグにはすべてclass属性がありますが、lableラベルにはありません。Formコンポーネントにはlabelラベルにカスタム属性を追加する方法もありません。
テンプレート言語のユーザー定義関数による
上のviewsの中のprint(obj[email].label_出力から見ると、djangoが提供するlabelラベルの生成方法は、atrsパラメータをサポートしてカスタム属性を実現する方法であり、問題は先端にテンプレート言語を使用する時にのみこのようにすることができます。引数が入らない。テンプレート言語の関数をカスタマイズしてこの問題を解決します。
ユーザー定義関数
関数をカスタマイズするには、次の手順で操作します。
APPでは、templatetagsディレクトリを作成します。ディレクトリ名は重要です。
任意のファイルを作成します。ここのファイル名は自由です。例えば、myfun.py。
ファイルにtemplate.Libraryオブジェクトを作成します。名前はregisterです。ここの対象名はレジスターでなければなりません。
そして自分の関数を書きますが、みんな@register.simpleを使います。このデコレーションがいいです。
ユーザー定義の関数は以下の通りです。

# 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})
そして、ページでユーザー定義の関数を使用します。

<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ウィジェットにatrsパラメータを追加することでラベルのカスタムスタイルを実現します。これはバックエンドに置いて実現されます。フロントエンドのカスタム仕様が既に実現されていますが、ここで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})
最後に、上記は難しいですか?面倒ですが、主に前のフォーマットを循環させるために、フォームをカスタマイズしたスタイルで表示することができます。

<body>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" 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=''を追加します。

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ディスプレイエラー情報

 <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方式を追加しました。つまり、小編集はみんなのすべての内容を共有しました。