9

関連するフィールドにエラーがある場合に、要素のマークアップに特定のクラスを追加するウィジェットを作成したいと思います。

ウィジェット定義コード内から、フィールドにエラーが関連付けられているかどうかを確認する方法に関する情報を見つけるのに苦労しています。

現在、次のスタブウィジェットコードがあります(最終的なウィジェットはより複雑なマークアップを使用します)。

from django import forms
from django.utils.safestring import mark_safe
class CustomTextWidget(forms.Widget):
        def render(self, name, value, attrs):
            field_has_errors=False # change to dynamically reflect field errors, somehow
            if field_has_errors:
                error_class_string="error"
            else:
                error_class_string="" 
            return mark_safe(
            "<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name)
            )

ここでfield_has_errorsブール値を設定するための賢明な方法に光を当てることができますか?(または、私がやろうとしていることを達成するためのより良い方法を提案するかもしれません)。前もって感謝します。

4

2 に答える 2

11

ジェイソンが言うように、ウィジェットはフィールド自体にアクセスできません。しかし、CSSのカスケードの性質を使用するのがより良い解決策だと思います。

{% for field in form %}
<div class="field{% if field.errors %} field_error{% endif %}">
{{ field }}
</div>
{% endfor %}

これでCSSで次のことができます。

div.field_error input { color: red }

またはあなたが必要なものは何でも。

于 2010-07-09T15:55:03.157 に答える
5

ウィジェットは、それが適用されているフィールドを認識していません。エラーに関する情報を保持するフィールドです。フォームのinitメソッドでerror_messagesを確認し、それに応じてエラークラスをウィジェットに挿入できます。

class YourForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourForm, self).__init__(*args, **kwargs)    
        attrs = {}
        if self.fields['your_field'].error_messages is not None:
            attrs['class'] = 'errors'
        self.fields['your_field'].widget = YourWidget(attrs=attrs)
于 2010-07-09T15:39:28.280 に答える