【问题标题】:Custom multivaluefield isn't displayed in empty form自定义多值字段不以空形式显示
【发布时间】:2011-04-14 10:33:34
【问题描述】:

我正在尝试在我的 django 应用程序中构建一个自定义多值小部件。

小部件

class DayInputWidget(MultiWidget):
    def __init__(self, attrs=None):
        widgets = (DayInput(day_name='Mo'), DayInput(day_name='Di'), DayInput(day_name='Mi'), DayInput(day_name='Do'), DayInput(day_name='Fr'))
        super(DayInputWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        print value
        if value:
            return value
        return None

输入

class DayInput(Input):
    input_type = 'text'
    def __init__(self,attrs=None,day_name=None):
        super(DayInput, self).__init__(attrs)
        self.day_name = day_name

    def render(self, name, value, attrs=None):
        if name is None:
            name = 'Bestellmenge_%s' % self.day_name
        # create day inputs
        return mark_safe(u'<label style="padding-left: 5px">%s</label><input type="text" name="%s" size="5px"  value="0"/> ' % (self.day_name,name))

字段

class DayInputField(forms.MultiValueField):
    widget = DayInputWidget

    def __init__(self, *args, **kwargs):
        fields = (forms.CharField(),forms.CharField(),forms.CharField(),forms.CharField(), forms.CharField())
        super(DayInputField, self).__init__(fields, *args, **kwargs)

    def compress(self, data_list):
        print data_list
        if data_list:
            return u'|'.join(data_list)
        return None 

表格

class OrderForm(forms.Form):
    Produktart = forms.ModelChoiceField(MProductTypes.objects.all())
    Kw = forms.CharField(widget=KwSelect(), required=False)
    Bestellmengen = fields.DayInputField()

问题:表单仅在绑定到数据时显示。如果我用空数据初始化表单,则会进行验证并将其显示出来。这里有什么问题?

我以这种方式初始化我的表单

form = OrderForm()

根据文档,表单应显示为空。

【问题讨论】:

  • 你是如何初始化表单的?

标签: python django django-forms


【解决方案1】:

尝试以下操作:在您的小部件类中,重写您的解压缩方法,使其不返回 None,而是返回 []:

class DayInputWidget(MultiWidget):
def __init__(self, attrs=None):
    widgets = (DayInput(day_name='Mo'), DayInput(day_name='Di'), DayInput(day_name='Mi'), DayInput(day_name='Do'), DayInput(day_name='Fr'))
    super(DayInputWidget, self).__init__(widgets, attrs)

def decompress(self, value):
    print value
    if value:
        return value
    return []

这是 in this SO answer 的建议,它帮助我处理了一个类似的案例。

【讨论】:

    猜你喜欢
    • 2014-07-11
    • 2017-05-22
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多