django multivaluefield& multiwidget - 使一个可选 [英] django multivaluefield & multiwidget - make one optional

查看:142
本文介绍了django multivaluefield& multiwidget - 使一个可选的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这与早期问题有关我想要一个包含一个Choice和TextInput小部件的MultiValueField。

This is related to an earlier question of mine.

如果用户从选择中选择OTHER,则应保存TextInput的值。否则,应该保存选择的值。到目前为止,我有以下代码:

I want to have a MultiValueField which contains a Choice and TextInput widget. If the user selects "OTHER" from the Choice, then the value of the TextInput should be saved. Otherwise, the value of the Choice should be saved. So far I have the following code:

custom_choices = [("one","one"),("two","two"),("OTHER","OTHER")]

class MyMultiWidget(forms.MultiWidget):
    def __init__(self,*args,**kwargs):
        widgets = (
            forms.Select(choices=custom_choices),
            forms.TextInput(),
        )
        super(MyMultiWidget, self).__init__(widgets,*args,**kwargs)

    def decompress(self, value):
        if value:
             return value.split("|")
        return ['', '']

class MyMultiValueField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        fields = (
            forms.CharField(max_length=128,required=True),
            forms.CharField(max_length=128,required=False),
        )
        super(MyMultiValueField, self).__init__(fields, *args, **kwargs)
        self.widget = TestMultiWidget()

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

class MyTestField(models.CharField):
    def formfield(self, **kwargs):
        return super(MyTestField, self).formfield(form_class=MyMultiValueField)

class MyModel(models.Model):
    myField = MyTestField()

但是,每当我尝试保存在TextInput中不包含值的东西时,我会收到一个验证错误这是必填栏。这是尽管上面的required = Falsekwarg。

However, whenever I try to save something which doesn't contain a value in the TextInput, I get a validation error "This field is required." This is in spite of the "required=False" kwarg above.

我已经尝试为清洁功能添加一些逻辑;忽略TextInput的小部件,如果选择小部件的值为OTHER:

I have tried to add some logic to the clean function; ignore the TextInput's widget if the Choice widget's value is "OTHER":

def clean(self,value):
    if value[0]!="OTHER":
        value[1]=u''
    else:
        if not value[1]:
            msg = "unspecified value"
            raise forms.ValidationError(msg)
        elif "|" in value[1]:
            msg = "bad value ('|' character is not allowed"
            raise forms.ValidationError(msg)
    super(TestFormField,self).clean(value)

但这没有任何效果。

任何建议?

推荐答案

正确的清洁版本应该如下所示:

The correct version of clean ought to look like this:

def clean(self,value):
    if value[0] != "OTHER":
        value[1] = u' '
    else:
        if value[1].strip() == u' ':
            msg = "unspecified value"
            raise forms.ValidationError(msg)
        elif "|" in value[1]:
            msg = "bad value ('|' character is not allowed)"
            raise forms.ValidationError(msg)
    return "|".join(value)

这篇关于django multivaluefield& multiwidget - 使一个可选的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆