Может ли Django ModelForm отображать пользовательское представление сохраненных значений? - PullRequest
2 голосов
/ 16 августа 2011

В моей модели процентные данные хранятся в виде дробных значений в диапазоне 0,0-1,0.Поскольку они представляют собой проценты, я хочу, чтобы пользователь просматривал и редактировал значения в диапазоне 0,0-100,0.

Какой предпочтительный способ преобразования данных между его сохраненным значением и отображаемое значение ?Обратите внимание, что формат зависит от другой переменной экземпляра.

Моя модель выглядит следующим образом:

class MyModel(models.Model):
    format = models.CharField(choices=(('percentage', 'Percentage'), ('absolute', 'Absolute'))
    my_value = models.FloatField()

    def _get_my_value_display(self):
        if self.format == 'percentage':
            return self.my_value * 100
        else:
            return self.my_value

    def _set_my_value_display(self, v):
        if self.format == 'percentage':
            return v / 100
        else:
            return self.my_value

    my_value_display = property(_get_my_value, _set_my_value)

В форме я пытался использовать свойство display в качестве поля формы, но это не'работа (неизвестные поля (my_value_display) указаны для MyModel):

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = ('my_value_display', )

1 Ответ

3 голосов
/ 16 августа 2011

Лично я, вероятно, попытался бы создать подкласс django.forms.FloatField и подкласс django.forms.TextInput, примерно так:

class PercentageInput(TextInput):
    def render(self, name, value, attrs=None):
        try:
            value = float(value)
            value *= 100
        except ValueError:
            pass
        return super(PercentageInput, self).render(name, value, attrs)

class PercentageField(FloatField):
    widget = PercentageInput
    def to_python(self, value):
        value = super(PercentageField, self).to_python(value)
        return value / 100

Тогда просто определите ваш ModelForm так:

class MyForm(forms.ModelForm):
    my_value = PercentageField()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...