Утверждение суммы значений в Django-admin - PullRequest
0 голосов
/ 04 февраля 2010

У меня есть модель Django для свитера, и я хочу иметь возможность вводить состав материалов, используемых в панели администратора (скажем: "100% шерсть" или "50% шерсть, 50% хлопок" или "50% шерсть , 45% хлопок, 5% акрил ").

У меня есть эта модель:

class Sweater(models.Model):
         wool   = models.IntegerField(max_length=3, default=100, verbose_name="wool (%)")
         cotton = models.IntegerField(max_length=3, default=0, verbose_name="cotton (%)")
         acryl  = models.IntegerField(max_length=3, default=0, verbose_name="acryl (%)")

Как и где я могу утверждать, что сумма значений шерсти, хлопка и акрила должна быть равна 100, чтобы пользователь не мог ввести, например, "100% шерсть, 100% хлопок, 100% акрил"?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

Скорее всего, вы должны сделать это как минимум в двух местах. Один, чтобы убедиться, что вы не получите неверные данные в модели, и один, чтобы сообщить пользователю, сумма не составляет 100%. Ниже приведены проверки суммы во время очистки формы:

class SweaterForm(ModelForm):
    """Form for adding and updating sweaters."""

    def clean(self):
        cleaned_data = self.cleaned_data
        wool = cleaned_data.get('wool')
        cotton = cleaned_data.get('cotton')
        acryl = cleaned_data.get('acryl')

        # Check that the fabric composition adds up to 100%
        if not 'wool' in self._errors \
                and not 'cotton' in self._errors \
                and not 'acryl' in self._errors \
                and (wool + cotton + acryl) != 100:
            msg = u"Composition must add up to 100%!"
            self._errors['wool'] = ErrorList([msg])

            # Remove field from the cleaned data as it is no longer valid
            del cleaned_data['wool']

        return cleaned_data

    class Meta:
        model = Sweater

Надеюсь, это поможет!

1 голос
/ 04 февраля 2010

В разрабатываемой версии Django вы можете написать валидатор формы , а затем указать его с помощью аргумента validator_list на одном из полей.

Если вы используете Django 1.1 или ниже, вы можете переопределить ModelForm, как предложено в ответе на этот вопрос .

Подробнее о проверке формы можно узнать в документации .

...