2010-12-01 5 views
1

IPアドレス/ドメイン名のエントリにMultiValueFieldを実装しようとしています。これは、データを入力するために期待どおりに動作します。 私の問題は、特定のデータにバインドされたフォームを表示する場合、[IPアドレス/ドメイン名]フィールドは空のままです。他のすべてのフィールドには、目的のデータが入力されます。通常のCharFieldを使用すると、私が期待するデータが得られます。しかし、私のカスタムフィールドでは機能しません。 私のカスタムMultiWidgetがその解凍メソッドを呼び出さないという事実まで追跡しました。ここでdjango multiwidgetサブクラスがdecompress()を呼び出さない

は私のフィールドです:

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のようなものにcompressの名前を変更した場合、私は(MultiWidgetのdjangoコードによると)NotImplementedErrorを得ることが期待されます。助言がありますか?

私は、ubuntu server 10.04でPython 2.6.5、django 1.1を使用しています。

+0

その他には、あまりにもその問題を持っているように見える:その問題のhttp://groups.google.com/group/django-users/browse_thread/thread/278e720f8b023877/ec8c2c1822a29d46?lnk=gst&q=decompress#ec8c2c1822a29d46 – Isaac

+0

よります。http: //groups.google.com/group/django-users/browse_thread/thread/26bea21d91fb99a7/9a92e921c888a7b4?lnk=gst&q=decompress#9a92e921c888a7b4 – Isaac

答えて

1

この問題は、MultiWidgetによって実装されたvalue_from_datadict()メソッドに問題があったことが判明しました。まず第一に、それはすでにリストを返していたので、最初にdecompress()が呼び出されなかったのです。第二に、それは常に[None、None]リストをreturenするので、バインドされたフォームは空のままです。

私は(私のaccessIPWidgetクラス内の)自分を実装するために必要な:

def value_from_datadict(self, data, files, name): 
try: 
    return data.get(name,None).rsplit() 
except AttributeError: 
    return [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)] 

今、最後の行は、元のメソッドが何をしたかです。バインドされたフォームにデータを取得するために、data.get(name、None).rsplit()を追加する必要がありました。

私が理解する限り、元のvalue_from_datadictメソッドはバインドされていないフィールドに対してのみ機能します。これは元のフィールドの名前をname + '_%s'に変更するためです。これは送信ボタンを押したときのものです。バインドされたメソッドを埋めるために、datadictは 'name'のためだけに照会される必要があります。

私はこれを回避する方法はありませんが、この動作は少なくともどこかに書かれているはずです。 多分私は何かを誤解したでしょうか?

関連する問題