2012-04-29 60 views
2

所有,Django的multivaluefield&multiwidget - 壓縮和/或解壓縮不工作

我有一個表格有MultiValueField是幾乎作品。它採用了choicefield和charfield(具有相應的選擇和TextInput的小部件)::

custom_choices = [("one","one"),("two","two"),("other","other")] 

class MyMultiWidget(forms.MultiWidget): 
    def __init__(self,*args,**kwargs): 
     widgets = (
      forms.Select(choices=custom_choices), 
      forms.TextInput(), 
     ) 
     super(MyMultiWidget, self).__init__(widgets,*args,**kwargs) 

    def decompress(self, value): 
     if value: 
      return value.split("|") 
     return ['', ''] 

class MyMultiValueField(forms.MultiValueField): 
    def __init__(self, *args, **kwargs): 
     fields = (
      forms.ChoiceField(required=True), 
      forms.CharField(max_length=128,required=False), 
     ) 
     super(MyMultiValueField, self).__init__(fields, *args, **kwargs) 
     self.widget = TestMultiWidget() 

    def compress(self, data_list): 
     if data_list: 
      return '|'.join(data_list) 

class MyTestField(models.Field): 
    def formfield(self, **kwargs): 
     return super(MyTestField, self).formfield(form_class=MyMultiValueField) 

class MyModel(models.Model): 
    myField = MyTestField() 

壓縮功能似乎是工作;它會按照預期返回兩個字符串的列表。但解壓縮中的「值」參數始終爲無。果然,當我直接檢查數據庫時,myField列始終設置爲空。任何想法在壓縮和解壓縮之間發生了什麼?爲什麼壓縮的值實際上不被存儲?

謝謝。

+0

您應該從實際包含數據的某個字段繼承「MyTestField」。你的情況可以是'CharField'或'TextField'。我認爲它會解決問題。 – ilvar 2012-04-30 04:37:08

+0

謝謝。這確實有幫助(如果你將它作爲答案,我會將其標記爲已接受)。但是也發現了另一個問題,我的代碼發佈爲[另一個問題](http://stackoverflow.com/questions/10454164/django-multivaluefield-multiwidget-make-one-optional) – trubliphone 2012-05-04 18:24:31

回答

1

您應該從實際包含數據的某個字段繼承MyTestField。你的情況可以是CharField或TextField。我認爲它會解決問題。