2010-12-01 7 views
1

Ich versuche, ein MultiValueField für IP-Adresse/Domain Name Einträge zu implementieren. Es funktioniert wie erwartet für die Eingabe von Daten. Mein Problem ist, dass das Feld IP-Adresse/Domänenname leer bleibt, wenn ich das an bestimmte Daten gebundene Formular anzeigen möchte. Alle anderen Felder sind mit den gewünschten Daten gefüllt. Wenn ich ein normales CharField verwende, bekomme ich die Daten, die ich erwarten würde. Aber es funktioniert nicht mit meinem benutzerdefinierten Feld. Ich habe es auf die Tatsache zurückverfolgt, dass mein benutzerdefiniertes MultiWidget seine Dekomprimierungsmethode nicht aufruft.django multiwidget Unterklasse nicht aufrufen dekomprimieren()

Hier ist mein Feld:

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) 

Und hier ist mein widget:

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) 

Das Ganze (in einem größeren Kontext) als

self.fields['access_IPs'] = accessIPField() 

nun aufgerufen wird als Sie können sehen, ich habe eine print-Anweisung in meine Komprimierungsmethode geschrieben, und ich bekomme diese Anweisung nie zu sehen. Auch, wenn ich compress in etwas wie foobar umbenenne, würde ich (laut dem Django-Code für MultiWidget) erwarten, NotImplementedError zu bekommen, was nicht der Fall ist. Irgendwelche Vorschläge?

Ich benutze Python 2.6.5, Django 1.1 auf Ubuntu-Server 10.04.

+0

Andere scheinen, dieses Problem zu haben: http://groups.google.com/group/django-users/browse_thread/thread/278e720f8b023877/ec8c2c1822a29d46?lnk=gst&q=decompress#ec8c2c1822a29d46 – Isaac

+0

mehr dieses Problem: http: //groups.google.com/group/django-users/browse_thread/thread/26bea21d91fb99a7/9a92e921c888a7b4?lnk=gst&q=decompress#9a92e921c888a7b4 – Isaac

Antwort

1

Es stellte sich heraus, dass das Problem mit der Methode "value_from_datadict()" auftrat, die von MultiWidget implementiert wurde. Zuallererst hat es bereits eine Liste zurückgegeben, deshalb wurde decompress() gar nicht erst aufgerufen. Zweitens retourniert es immer eine [None, None] -Liste, deshalb blieb die gebundene Form leer.

ich brauchte, um meine eigenen (in meiner accessIPWidget Klasse) zu implementieren:

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)] 

Nun ist die letzte Zeile, was tat die ursprüngliche Methode ist. Um die Daten in die gebundene Form zu bringen, musste ich data.get (name, None) .rsplit() hinzufügen.

Soweit ich verstehe, funktioniert die ursprüngliche Methode value_from_datadict nur für ungebundene Felder. Weil es den Namen des ursprünglichen Felds in name + '_% s' ändert, was Sie erhalten, wenn Sie auf die Senden-Schaltfläche klicken. Um eine gebundene Methode auszufüllen, muss das Datadict nur nach 'name' abgefragt werden.

Hm, nicht sicher, ob es einen Weg gibt, aber es scheint mir, dass dieses Verhalten zumindest irgendwo dokumentiert werden sollte. Vielleicht habe ich etwas falsch verstanden? Auch

Verwandte Themen