Django:如何检查自定义小部件定义中是不是存在字段错误?

Posted

技术标签:

【中文标题】Django:如何检查自定义小部件定义中是不是存在字段错误?【英文标题】:Django: How to check if there are field errors from within custom widget definition?Django:如何检查自定义小部件定义中是否存在字段错误? 【发布时间】:2011-03-13 22:07:13 【问题描述】:

我想创建小部件,当相关字段出现错误时,将特定类添加到元素标记中。

我很难从小部件定义代码中找到有关如何检查字段是否存在相关错误的信息。

目前我有以下存根小部件代码(最终小部件将使用更复杂的标记)。

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 布尔值的明智方法吗? (或者也许建议一种更好的方法来完成我正在尝试做的事情)。提前致谢。

【问题讨论】:

【参考方案1】:

小部件不知道它所应用的字段。它是维护有关错误信息的字段。您可以在表单的 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)

【讨论】:

更好的 DRY 答案【参考方案2】:

正如 Jason 所说,小部件无法访问该字段本身。我认为更好的解决方案是使用 CSS 的级联特性。

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

现在你可以在你的 CSS 中做:

div.field_error input  color: red 

或任何你需要的。

【讨论】:

这绝对是要走的路,实际上也是我在自己的工作中一直采用的方法。我提供的示例是拼凑在一起的,目的是展示将​​属性传递给小部件(不仅仅是自定义小部件),但是应该避免它,因为它不是 DRY。 两年后它帮助了我。谢谢你:) 为什么他们不将错误信息传递给小部件呢?对我来说这似乎是合理的,因为在字段的输入旁边呈现错误是很常见的。

以上是关于Django:如何检查自定义小部件定义中是不是存在字段错误?的主要内容,如果未能解决你的问题,请参考以下文章

以自定义形式使用 Django 时间/日期小部件

Django Admin:仅对一个模型字段使用自定义小部件

Django_filters 小部件自定义

自定义 Django 小部件/字段:对象没有属性“attrs”

编写自定义 Django 小部件的教程?

动态自定义 django 表单小部件