Джанго Мантоманы Валидация - PullRequest
6 голосов
/ 04 октября 2010

Пожалуйста, смотрите код ниже.По сути, когда пользователь создает объект этого класса, ему нужно указать value_type.Если value_type==2 (в процентах), то percentage_calculated_on (который является CheckboxSelectMultiple на стороне формы / шаблона, необходимо проверить один или несколько элементов. Проверка модели не позволяет мне проверить, как я пытаюсь -он в основном выдает исключение, которое говорит мне, что экземпляр должен иметь значение первичного ключа, прежде чем можно будет использовать отношение многие ко многим. Но мне нужно сначала проверить объект перед его сохранением. Я пробовал эту проверку в форме(modelform) сторона (используя чистый метод формы), но там тоже происходит то же самое.

Как мне добиться этой проверки?

INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible'))
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage'))

class Payable(models.Model):
    name = models.CharField()
    short_name = models.CharField()
    inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES)
    value = models.DecimalField(max_digits=12,decimal_places=2)
    value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES)
    percentage_calculated_on = models.ManyToManyField('self', symmetrical=False)

    def clean(self):
        from django.core.exceptions import ValidationError
        if self.value_type == 2 and not self.percentage_calculated_on:
            raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.")

1 Ответ

2 голосов
/ 04 октября 2010

Я проверил ваш код в одном из приложений администратора моего проекта. Я смог выполнить необходимую вам проверку с помощью пользовательского ModelForm. Смотри ниже.

# forms.py
class MyPayableForm(forms.ModelForm):
    class Meta:
        model = Payable

    def clean(self):
        super(MyPayableForm, self).clean() # Thanks, @chefsmart
        value_type = self.cleaned_data.get('value_type', None)
        percentage_calculated_on = self.cleaned_data.get(
             'percentage_calculated_on', None)
        if value_type == 2 and not percentage_calculated_on:
            message = "Please specify on what payables/deductibles ..."
            raise forms.ValidationError(message)
        return self.cleaned_data

# admin.py
class PayableAdmin(admin.ModelAdmin):
    form = MyPayableForm

admin.site.register(Payable, PayableAdmin)

Приложение Admin использует виджет SelectMultiple (а не CheckboxSelectMultiple, как вы делаете), чтобы представлять многие отношения. Я считаю, что это не должно иметь значения, хотя.

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