检查小部件级别的错误和其他值 - 可能使用自定义表单字段

use*_*631 6 django django-forms django-widget

如果某个字段有小部件错误,我如何访问?

使用默认我试过:

{% if widget.attributes.has_errors %} or {% if widget.has_errors %}
Run Code Online (Sandbox Code Playgroud)

但是没有用.

我使用自定义窗口小部件模板,我想使用自定义窗体字段并覆盖默认字段.

我知道clean方法存在,但我不知道如何向我的小部件推送我想要的动态(非默认)数据/属性.

我试过了:

class AWidget(forms.Widget):

    def get_context(self, name, value, attrs):

        context = super().get_context(name, value, attrs)
        has_errors = context['widget']['attrs'].pop('has_errors', None)
         context['widget']['has_errors'] = has_errors
Run Code Online (Sandbox Code Playgroud)

它适用errors但我不知道是否是最好的选择加上我想从Form Field传递其他值/属性,我认为最好尝试覆盖Form Field但我不确切知道如何.

还使用以下方式访问各个属

 {{ widget.attrs.maxlength }} or  {{ widget.attrs.items.maxlength }}
Run Code Online (Sandbox Code Playgroud)

即使在for循环中加入也是如此


我知道我可以添加一个带有一类错误的父div:

 <div class="{% if form.field.errors %}pass_error{% endif %}">
        {{ form.field }} 
    </div>
Run Code Online (Sandbox Code Playgroud)

但是,这意味着css级别的重大变化.

我已经使用自定义小部件覆盖所有Django小部件,错误我不仅需要更改边框颜色,而是显示或不显示小部件模板的不同元素以及其中一些的位置发生变化.

我已经修改了基于窗口小部件以添加错误,但是我希望通过从字段传递到窗口小部件,以及根据错误类型的参数,以更优雅的方式在字段级别执行此操作.

所以我的问题是我需要覆盖从字段传递到窗口小部件错误和其他变量?

Mar*_*ndi 3

不确定这是否对您的特定用例有帮助......但为了以防万一,请注意,当您在视图中构建表单时,您可以根据需要添加额外的参数,然后将它们传递给您的自定义小部件。

工作示例:

文件“forms.py”

from django import forms


def build_ingredient_form(unit):
    """
    Ingredient form factory

    Here we build the form class dynamically, in order to acces 'unit' via closure.
    References:
        http://stackoverflow.com/questions/622982/django-passing-custom-form-parameters-to-formset#623030
    """
    class IngredientForm(forms.Form):
        #quantity = forms.DecimalField(max_digits=10)
        quantity = UnitField(unit, required=False)
        ...
    return IngredientForm


Run Code Online (Sandbox Code Playgroud)

文件“fields.py”

from django import forms
from .fields import UnitField


class UnitField(forms.CharField):
    """
    Custom field to support UnitWidget

    References:
        - http://tothinkornottothink.com/post/10815277049/django-forms-i-custom-fields-and-widgets-in
    """

    def __init__(self, unit, *args, **kwargs):
        self.unit = unit
        super(UnitField, self).__init__(*args, **kwargs)
        self.widget = UnitWidget(unit)

    ...

Run Code Online (Sandbox Code Playgroud)

文件“widgets.py”

from django import forms
from .models import Unit


class UnitWidget(forms.TextInput):

    def __init__(self, unit, attrs=None):
        if unit is None:
            self.unit = Unit()
        else:
            self.unit = unit

    ...

Run Code Online (Sandbox Code Playgroud)