IP アドレス/ドメイン名のエントリに MultiValueField を実装しようとしています。データを入力するために期待どおりに機能します。私の問題は、特定のデータにバインドされたフォームを表示したい場合、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()
ご覧のとおり、compress メソッドに print ステートメントを入れましたが、そのステートメントは表示されません。また、compress の名前を foobar のような名前に変更すると、(MultiWidget の django コードによると) NotImplementedError が発生すると予想されますが、そうではありません。助言がありますか?
ubuntuサーバー10.04でpython 2.6.5、django 1.1を使用しています。