djangoはFormで生成されたlabelラベルにclass方式を追加します。
Formを使ってhtmlタグを生成する場合、Widgetを提供した方法でカスタムタグを作ることができますが、生成したinputタグにのみスタイルを追加することができます。生成したlabelタグにはスタイルを追加することができません。
多くのシーンではlabelとinputにclassを追加してカスタムスタイルを実現する必要があります。
テスト環境
Formを作成して、FormでHTMLを作成してください。
テンプレート言語のユーザー定義関数による
上のviewsの中のprint(obj[email].label_出力から見ると、djangoが提供するlabelラベルの生成方法は、atrsパラメータをサポートしてカスタム属性を実現する方法であり、問題は先端にテンプレート言語を使用する時にのみこのようにすることができます。引数が入らない。テンプレート言語の関数をカスタマイズしてこの問題を解決します。
ユーザー定義関数
関数をカスタマイズするには、次の手順で操作します。
APPでは、templatetagsディレクトリを作成します。ディレクトリ名は重要です。
任意のファイルを作成します。ここのファイル名は自由です。例えば、myfun.py。
ファイルにtemplate.Libraryオブジェクトを作成します。名前はregisterです。ここの対象名はレジスターでなければなりません。
そして自分の関数を書きますが、みんな@register.simpleを使います。このデコレーションがいいです。
ユーザー定義の関数は以下の通りです。
ここでもう一つのメリットがあります。先端パターンを追加したコードを先端のhtmlに入れて実現しました。
inputラベルのためにもカスタム関数を書きます。
djangoデフォルトの方法はFormで、Widgetsウィジェットにatrsパラメータを追加することでラベルのカスタムスタイルを実現します。これはバックエンドに置いて実現されます。フロントエンドのカスタム仕様が既に実現されていますが、ここでinputタグを生成する方法を探しました。as_です。widget()
パターンに従ってサブ定義関数を書きます。
Formsレンダリングラベルの種類
パスワードタイプ、テキストタイプ、メールボックスタイプのボックス
表示
多くのシーンでは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方式を追加しました。つまり、小編集はみんなのすべての内容を共有しました。