Проверка пустого django поле формы не работает - PullRequest
1 голос
/ 26 мая 2020

Я всегда использую следующий код для проверки формы, чтобы предотвратить отправку пустой формы. Он всегда работает в Django 1.8, но по какой-то причине не работает в Django 2.2.

Вот форма

class CreateForm(forms.ModelForm):
    class Meta:
        model = Device
        fields = ['category', 'item_name', 'quantity']

    def clean_category(self):
        category = self.cleaned_data.get('category')
        if category == '':
            raise forms.ValidationError('This field is required')
        return category


    def clean_item_name(self):
        item_name = self.cleaned_data.get('item_name')
        if item_name == '':
            raise forms.ValidationError('This field is required')
        return item_name

Вот модель

class Device(models.Model):
    category = models.CharField(max_length=50, blank=True, null=True)
    item_name = models.CharField(max_length=50, blank=True, null=True)
    quantity = models.IntegerField(default='0', blank=False, null=True)

Спасибо

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Поскольку вы указываете эти поля как blank=True и null=True в своей модели, измените эти атрибуты

class Device(models.Model):
    category = models.CharField(max_length=50, blank=False, null=False)

Или по умолчанию, если вы не укажете эти blank и null атрибут, то по умолчанию он будет ложным, так что это также должно работать

class Device(models.Model):
    category = models.CharField(max_length=50)

EDIT на основе комментария: Как сказал Виллем, вам нужно проверить на None. .

def clean_category(self):
    category = self.cleaned_data.get('category')
    if not category:
        raise forms.ValidationError('This field is required')
    return category
1 голос
/ 26 мая 2020

Думаю проблема в том, что вы не проверяли на None, но тем не менее. Я думаю, ты сам стараешься слишком много работать. Вы можете просто указать, что это поле required=True [Django -doc] , это будет:

По умолчанию каждый класс поля предполагает значение является обязательным, поэтому, если вы передадите пустое значение - либо None, либо пустую строку ("") - тогда clean() вызовет исключение ValidationError.

Таким образом, мы можем сделать поля обязательными с помощью:

class CreateForm(forms.ModelForm):
    category = forms.CharField(<b>required=True</b>, max_length=50)
    item_name = forms.CharField(<b>required=True</b>, max_length=50)

    class Meta:
        model = Device
        fields = ['category', 'item_name', 'quantity']

При этом довольно "странно" указывать blank=True [Django -doc] , поскольку это фактически означает, что поле не требуется в модельных формах. blank=True не означает, что пустая строка разрешена, поскольку даже с blank=False вы можете хранить пустые строки в поле. A ModelForm будет определять (большую часть) свою валидацию на основе модели, которую он «обертывает», поэтому это означает, что если вы определите модель лучше, вы удалите много шаблонного кода. Поэтому я бы посоветовал исключить blank=True.

...