Я пытаюсь реализовать записи MultiValueField для IP-адреса / доменного имени. Это работает, как ожидается, для ввода данных.
Моя проблема заключается в том, что если я хочу отобразить форму, привязанную к конкретным данным, поле IP-адрес / имя домена остается пустым. Все остальные поля заполнены требуемыми данными. Если я использую обычный CharField, я получаю данные, которые ожидаю. Но это не работает с моим настраиваемым полем.
Я отследил это до того факта, что мой пользовательский MultiWidget не вызывает его метод распаковки.
Вот мое поле:
class accessIPField(forms.MultiValueField):
"""
custom Field for access IP
"""
def __init__(self, *args, **kwargs):
self.fields=(
forms.IPAddressField(label='IP Adress'),
forms.CharField(max_length=50,label='Domain Name')
)
self.widget=accessIPWidget()
super(accessIPField,self).__init__(self.fields,self.widget, *args, **kwargs)
def compress(self,data_list):
if data_list:
return " ".join(data_list)
А вот и мой виджет:
class accessIPWidget(forms.MultiWidget):
"""
Widget to display IP Adress / Domain name pairs
"""
def __init__(self,*args,**kwargs):
self.widgets=(forms.TextInput(),forms.TextInput())
super(accessIPWidget,self).__init__(self.widgets,*args,**kwargs)
def decompress(self,value):
print 'decompress called'
if value:
return value.rsplit()
return [None,None]
def format_output(self, rendered_widgets):
return u'\n'.join(rendered_widgets)
Все это называется (в более широком контексте) как
self.fields['access_IPs'] = accessIPField()
Теперь, как вы можете видеть, я поместил оператор print в свой метод сжатия, и мне так и не удалось увидеть это утверждение. Кроме того, если я переименую сжатие в нечто вроде foobar, я ожидаю (согласно коду django для MultiWidget) получить NotImplementedError, что не так. Есть предложения?
Я использую python 2.6.5, django 1.1 на сервере Ubuntu 10.04.