MultiValueField в дополнительном встроенном
Я настроил MultiValueField, который используется во встроенном режиме. Если я оставляю MultiValueField пустым, кажется, что он все еще заполнен. В результате я продолжаю получать ошибки проверки формы, потому что в отношении формы эти строки не пусты (и поэтому проверяются).
Так что, думаю, мне интересно: есть ли уловки по настройке MultiValueField, чтобы он мог быть явно пустым, чтобы я мог избежать появления ошибки проверки?
Вот код, о котором идет речь:
class TypedValueField(forms.MultiValueField):
def __init__(self, *args, **kwargs):
fields = (
forms.ChoiceField(required=False, choices=[(None, '(type)')] + [(c,c) for c in ['int','float','bool','string']]),
forms.CharField(required=False)
)
super(TypedValueField, self).__init__(fields, *args, **kwargs)
def compress(self, data_list):
if data_list:
# Raise a validation error if time or date is empty
# (possible if SplitDateTimeField has required=False).
if data_list[1]=="" or data_list[1]==None:
return data_list[1]
if data_list[0] == 'bool':
try:
if data_list[1].lower() == "true":
return True
except:
pass
try:
if int(data_list[1] == 1):
return True
except ValueError:
raise forms.ValidationError("You must enter True or False")
return False
if data_list[0] == 'int':
try:
return int(data_list[1])
except ValueError:
raise forms.ValidationError("You must enter a number")
if data_list[0] == 'float':
try:
return float(data_list[1])
except ValueError:
raise forms.ValidationError("You must enter a decimal number")
if data_list[0] == 'string':
return data_list[0]
else:
raise forms.ValidationError("Invalid data type")
return None
class TypedValueWidget(forms.MultiWidget):
def __init__(self, attrs=None):
widgets = (
forms.Select(choices=[(None, '(type)')] + [(c,c) for c in ['int','float','bool','string']]),
forms.TextInput()
)
super(TypedValueWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
if isinstance(value, bool):
return ['bool', value]
if isinstance(value, float):
return ['float', value]
if isinstance(value, int):
return ['int', value]
if isinstance(value, basestring):
return ['string', value]
else:
raise Exception("Invalid type found: %s" % type(value))
return [None, None]
class ParamInlineForm(forms.ModelForm):
match = TypedValueField(required=False, widget=TypedValueWidget())
class Meta:
model = Param
2 ответа
Это была моя проблема, прямо здесь:
fields = (
forms.ChoiceField(required=False, choices=[(None, '(type)')] + [(c,c) for c in ['int','float','bool','string']]),
forms.CharField(required=False)
)
Необходимо изменить на
fields = (
forms.ChoiceField(required=False, choices=[("", '(type)')] + [(c,c) for c in ['int','float','bool','string']]),
forms.CharField(required=False)
)
Если вы используете None
как значение для выбора в поле выбора, оно отображается как
<option value="None">(type)</option>
вместо
<option value="">(type)</option>
Вот виновный исходный код в Django (в Select
класс виджетов render_option
метод):
return u'<option value="%s"%s>%s</option>' % (
escape(option_value), selected_html,
conditional_escape(force_unicode(option_label)))
Я не могу придумать ни одной ситуации, в которой вы бы указали None
как ценность и хочу получить "None"
назад. Хотя конечно пустое значение ""
также отличается от None
,
Переопределить чистый метод MutliValueField
(посмотрите на источник Django)