simplyvic
simplyvic

Reputation: 243

Validating blank django form field not working

I always use the following code to validate a form to prevent blank form submission. It always works in Django 1.8 but for some reason is not working in Django 2.2.

Here is the form

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

Here is the model

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)

Thanks

Upvotes: 2

Views: 2489

Answers (2)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476557

I think the problem is that you did not check fro None, but nevertheless. I think you aim to do too much work yourself. You can just specify that the field is required=True [Django-doc], this will:

By default, each Field class assumes the value is required, so if you pass an empty value - either None or the empty string ("") - then clean() will raise a ValidationError exception.

So we can make the fields required with:

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

That being said, it is rather "odd" to specify blank=True [Django-doc] since this actually means that the field is not required in model forms. blank=True does not mean that the empty string is allowed, since even with blank=False, you can store empty strings in the field. A ModelForm will define (most of) its validation based on the model it "wraps", so that means that if you define the model better, you remove a lot of boilerplate code. Therefore I would advise eliminating blank=True.

Upvotes: 4

Arjun Shahi
Arjun Shahi

Reputation: 7330

Since you are specifying these fields as blank=True and null=True in your model so change those attributes

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

Or by default if you don't specify these blank and null attribute then it will be false by default so this should work also

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

EDIT based on the comment: Like the Willem said you need to check for None.You can do like this.

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

Upvotes: 2

Related Questions