2016-12-19 3 views
0

Я подклассифицировал класс MultiWidget Django и столкнулся с проблемой в методе распаковки. Вызывается метод распаковки, однако «значение» всегда равно «Нет», хотя в базе данных для этого поля есть определенные данные. Я даже попробовал переопределить метод рендеринга, а значение здесь тоже отсутствует. Проблема заключается в том, что значение должно быть не-Null при вызове метода распаковки, но вместо этого оно равно None. Я использую MultiWidget в сочетании с подклассом MultiValueField. Вот код:django multiwidget decpress value is None

forms.py:

class MyMultiWidget(forms.widgets.MultiWidget): 

    def __init__(self, attrs=None): 
     self.attrs = attrs 
     widgets = (
      TextInput(), 
      TextInput(), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
      CheckboxInput(attrs={'value': False}), 
     ) 
     super(MyMultiWidget, self).__init__(widgets, attrs) 

    def decompress(self, value): # decompress stored database format to HTML form format 
     print('decompress called') 
     print("this is my value: " + str(value)) 
     if value: 
      dict_value = json.loads(value) 
      return dict_value 
     return "" 

#=============================================================== 

class MyMultiField(forms.fields.MultiValueField): 
    widget = MyMultiWidget 

    def __init__(self, *args, **kwargs): 
     fields = (
      forms.CharField(), 
      forms.CharField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
      forms.BooleanField(), 
     ) 
     super(MyMultiField, self).__init__(fields=fields, *args, **kwargs) 

    def compress(self, values): 
     print('my values: ' + str(values)) 
     return json.dumps(values) 

#=============================================================== 

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
      self.helper = FormHelper() 
      self.helper.form_tag = False 
      self.helper.layout = Layout(
      ) 
      super(MyForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = MyModel 

    my_multi_field = MyMultiField(required=False, widget=MyMultiWidget()) 

Если кто не мог сказать мой, почему я вижу Нет для аргумента значения в декомпрессия, что будет высоко ценится.

+0

Я не могу сказать вам, почему вы видите Нет, но я могу сказать вам, что вы делаете неправильно. Хранение CSV в столбце. – e4c5

ответ

0

Наконец-то выяснилось, что я делаю неправильно. Как оказалось, проблема не имела ничего общего с MultiValueField или MultiWidget, а скорее небрежная опечатка с моей стороны. Проблема была в моем файле view.py в моей функции просмотра представлений, когда я извлекал экземпляр модели из базы данных. Я делал:

MyModel(pk=my_id)

Когда я должен был делать:

MyModel.objects.get(pk=my_id)

Так что я даже не получаю экземпляр модели на всех. Само собой разумеется, я чувствую себя довольно немым прямо сейчас;), но Im рад, что он исправлен. Надеюсь, это поможет кому-то еще как-нибудь!