Django: Как проверить, есть ли ошибки поля из определения пользовательского виджета - PullRequest
7 голосов
/ 09 июля 2010

Я хотел бы создать виджеты, которые добавляют определенные классы к разметке элемента, когда в связанном поле есть ошибки.

Мне трудно найти информацию о том, как проверить, есть ли в поле ошибки, связанные сэто, из кода определения виджета.

На данный момент у меня есть следующий код заглушки виджета (в конечном виджете будет использоваться более сложная разметка).

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 Boolean здесь?(или, возможно, предложить лучший способ выполнить то, что я пытаюсь сделать).Заранее спасибо.

Ответы [ 2 ]

10 голосов
/ 09 июля 2010

Как говорит Джейсон, виджет не имеет доступа к самому полю. Я думаю, что лучшее решение - использовать каскадный характер CSS.

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

Теперь в вашем CSS вы можете сделать:

div.field_error input { color: red }

или что вам нужно.

4 голосов
/ 09 июля 2010

Виджет не знает области, к которой он применяется. Это поле, в котором хранится информация об ошибках. Вы можете проверить сообщения об ошибках в методе init вашей формы и соответствующим образом внедрить класс ошибок в ваш виджет:

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)
...