django multivaluefield & multiwidget - сжатие и / или распаковка не работает

Все,

У меня есть форма с MultiValueField, которая почти работает. Он использует поле выбора и поле char (с соответствующими Select и 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()

Функция сжатия, кажется, работает; он возвращает список из двух строк, как и ожидалось. Но аргумент "value" в декомпрессии всегда равен None. Конечно же, когда я проверяю базу данных напрямую, столбец myField постоянно имеет значение null. Есть идеи, что происходит между сжатием и распаковкой? Почему на самом деле значение компресса не сохраняется?

Благодарю.

1 ответ

Решение

Вы должны унаследовать MyTestField от некоторого поля, которое фактически содержит данные. В вашем случае это может быть CharField или TextField. Я думаю, что это решит проблему.

Другие вопросы по тегам