Выполнить проверку Django для поля, которое НЕ является частью формы

Я хотел бы поднять ValidationError на основе одного из полей в моей модели Django, не имея соответствующего файла как части ModelForm. Погуглив немного, я нашел концепцию валидаторов для моделей. Итак, я попытался сделать следующее:

def minimumDuration(value):
    if value == 0:
        raise ValidationError("Minimum value accepted is 1 second!")

class PlaylistItem(models.Model):
    position = models.IntegerField(null=False)
    content = models.ForeignKey(Content, null=True, on_delete=models.SET_NULL)
    item_duration = models.IntegerField(validators = [minimumDuration], default = 5, null=True, blank=True)
    playlist = models.ForeignKey(Playlist, null=True, on_delete=models.CASCADE)

Однако при вводе 0 в соответствующем поле ошибка не появляется. Из документации Django я узнал, что валидаторы не применяются автоматически при сохранении модели. Он перенаправил меня на эту страницу, но я не совсем понимаю, как их применять. Есть идеи?


person Rosi98    schedule 15.09.2020    source источник
comment
так что именно непонятно, что ты пробовал   -  person iklinac    schedule 15.09.2020
comment
есть форма под названием ModelForm который сохраняет данные из формы в таблицу БД модели, к которой она привязана. Проверка работает только тогда, когда вы работаете с формами.   -  person yedpodtrzitko    schedule 15.09.2020


Ответы (1)


Вот пример формы с таким настраиваемым полем вне Модели:

class ExampleForm(forms.ModelForm):
    custom_field = forms.BooleanField(
        label='Just non model field, replace with the type you need',
        required=False
    )

    class Meta:
        model = YourModel

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # optional: further customize field widget
        self.fields['custom_field'].widget.attrs.update({
            'id': self.instance.pk + '-custom_field',
            'class': 'custom-field-class'
        })
        self.fields['custom_field'].initial = self._get_custom_initial()

    def _get_custom_initial(self):
        # compute initial value based on self.instance and other logic
        return True

    def _valid_custom_field(value):
        # validate your value here
        # return Boolean

    def clean(self):
        """
        The important method: override clean to hook your validation
        """
        super().clean()
        custom_field_val = self.cleaned_data.get('custom_field')
        if not self._valid_custom_field(custom_field_val):
            raise ValidationError(
                'Custom Field is not valid')
person David Veza    schedule 15.09.2020
comment
Мне нужно было наоборот. Поле, которое НЕ в форме, а в модели. Я думал, что для этой проверки должно быть 1-2 строки, но в итоге я написал свою собственную функцию проверки внутри views.py. Тем не менее, я ценю ваш подробный ответ и обязательно воспользуюсь им, если окажусь в обратной ситуации, ха-ха. Спасибо! - person Rosi98; 18.09.2020
comment
Но почему бы вам не включить его в форму и не сделать там валидацию :) (аналогично валидации модели) - person David Veza; 18.09.2020