Bird
Raised Fist0
Djangoframework~10 mins

Custom form validation methods in Django - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define a custom clean method for the 'email' field in a Django form.

Django
def clean_[1](self):
    email = self.cleaned_data.get('email')
    if not email.endswith('@example.com'):
        raise forms.ValidationError('Email must be from example.com domain')
    return email
Drag options to blanks, or click blank then click option'
Aemail
Bcheck_email
Cvalidate_email
Dclean_email
Attempts:
3 left
💡 Hint
Common Mistakes
Using a method name that does not start with 'clean_'
Not returning the cleaned data at the end
2fill in blank
medium

Complete the code to raise a validation error if the 'age' field is less than 18.

Django
def clean_age(self):
    age = self.cleaned_data.get('age')
    if age [1] 18:
        raise forms.ValidationError('You must be at least 18 years old')
    return age
Drag options to blanks, or click blank then click option'
A<
B>=
C>
D<=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '>=' instead of '<'
Using '<=' which includes 18, but 18 is allowed
3fill in blank
hard

Fix the error in the custom form validation method to correctly check if the username contains spaces.

Django
def clean_username(self):
    username = self.cleaned_data.get('username')
    if ' ' [1] username:
        raise forms.ValidationError('Username cannot contain spaces')
    return username
Drag options to blanks, or click blank then click option'
Ain
Bnot in
C==
D!=
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'not in' which reverses the logic
Using '==' which compares equality, not containment
4fill in blank
hard

Fill both blanks to create a custom form validation method that checks if the password and confirm_password fields match.

Django
def clean(self):
    cleaned_data = super().[1]()
    password = cleaned_data.get('password')
    confirm = cleaned_data.get('[2]')
    if password != confirm:
        raise forms.ValidationError('Passwords do not match')
    return cleaned_data
Drag options to blanks, or click blank then click option'
Aclean
Bcleaned_data
Cconfirm_password
Dclean_password
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'cleaned_data' instead of 'clean()' for the super call
Using wrong field name for confirm password
5fill in blank
hard

Fill all three blanks to create a custom validation method that ensures the 'title' field is capitalized and at least 5 characters long.

Django
def clean_[1](self):
    title = self.cleaned_data.get('[2]')
    if len(title) [3] 5:
        raise forms.ValidationError('Title must be at least 5 characters long')
    return title.capitalize()
Drag options to blanks, or click blank then click option'
Atitle
C<
D>
Attempts:
3 left
💡 Hint
Common Mistakes
Using '>' instead of '<' for length check
Using wrong method name or field name

Practice

(1/5)
1. What is the purpose of defining a clean_fieldname method in a Django form?
easy
A. To handle form submission via AJAX
B. To automatically save the form data to the database
C. To add custom validation logic for a specific form field
D. To style the form field with CSS classes

Solution

  1. Step 1: Understand the role of clean_fieldname

    This method is used to add validation logic for a single field in a Django form.
  2. Step 2: Differentiate from other methods

    Unlike clean which validates multiple fields, clean_fieldname focuses on one field only.
  3. Final Answer:

    To add custom validation logic for a specific form field -> Option C
  4. Quick Check:

    clean_fieldname validates one field [OK]
Hint: Remember: clean_fieldname validates one field only [OK]
Common Mistakes:
  • Confusing clean_fieldname with clean method
  • Thinking it saves data automatically
  • Assuming it styles the form
2. Which of the following is the correct way to raise a validation error inside a custom clean method for a field named email?
easy
A. return ValidationError('Invalid email')
B. raise ValidationError('Invalid email')
C. self.add_error('email', 'Invalid email')
D. ValidationError('Invalid email')

Solution

  1. Step 1: Identify how to raise errors in Django forms

    In custom clean methods, you raise a ValidationError to signal invalid data.
  2. Step 2: Check the syntax for raising errors

    The correct syntax is to use raise ValidationError('message'), not return or just call it.
  3. Final Answer:

    raise ValidationError('Invalid email') -> Option B
  4. Quick Check:

    Use raise to throw ValidationError [OK]
Hint: Use raise, not return, to signal validation errors [OK]
Common Mistakes:
  • Using return instead of raise
  • Calling ValidationError without raise
  • Misusing self.add_error inside clean_fieldname
3. Given this Django form snippet, what will happen if the user enters 'abc' for the age field?
class MyForm(forms.Form):
    age = forms.IntegerField()

    def clean_age(self):
        age = self.cleaned_data.get('age')
        if age < 18:
            raise ValidationError('Must be at least 18')
        return age
medium
A. Form will crash with a TypeError
B. Form will accept 'abc' and pass validation
C. clean_age will raise 'Must be at least 18' error
D. Form will raise a validation error because 'abc' is not an integer

Solution

  1. Step 1: Understand IntegerField behavior

    IntegerField automatically validates input to be an integer before calling clean_age.
  2. Step 2: Analyze input 'abc'

    'abc' is not an integer, so IntegerField will raise a validation error before clean_age runs.
  3. Final Answer:

    Form will raise a validation error because 'abc' is not an integer -> Option D
  4. Quick Check:

    IntegerField rejects non-integers first [OK]
Hint: IntegerField validates type before custom clean runs [OK]
Common Mistakes:
  • Thinking clean_age handles type errors
  • Assuming 'Must be at least 18' error triggers for 'abc'
  • Expecting a crash instead of validation error
4. Identify the error in this custom form validation method:
def clean(self):
    data = self.cleaned_data
    if data['start_date'] > data['end_date']:
        raise ValidationError('Start date must be before end date')
    return data
medium
A. Accessing cleaned_data directly without calling super().clean()
B. Raising ValidationError with a string instead of a dictionary
C. Not returning cleaned_data at the end of clean()
D. Using '>' operator instead of '>=' for date comparison

Solution

  1. Step 1: Check how clean() should be overridden

    When overriding clean(), you must call super().clean() to get cleaned_data properly.
  2. Step 2: Identify the error in accessing cleaned_data

    This code accesses self.cleaned_data directly without calling super().clean(), which may cause missing or incomplete data.
  3. Final Answer:

    Accessing cleaned_data directly without calling super().clean() -> Option A
  4. Quick Check:

    Always call super().clean() first [OK]
Hint: Call super().clean() before using cleaned_data [OK]
Common Mistakes:
  • Forgetting to call super().clean()
  • Returning wrong data type
  • Misusing ValidationError format
5. You want to ensure that a Django form's password and confirm_password fields match. Which is the best way to implement this validation?
hard
A. Override the form's clean method to compare both fields and raise ValidationError if they differ
B. Add a validator to the password field that checks confirm_password
C. Define a clean_password method that compares both fields
D. Use JavaScript on the client side only to check matching passwords

Solution

  1. Step 1: Understand field-level vs form-level validation

    Field-level methods like clean_password only see one field's data, so can't compare two fields.
  2. Step 2: Use form-level clean() for cross-field validation

    Overriding clean lets you access all fields and compare password and confirm_password.
  3. Final Answer:

    Override the form's clean method to compare both fields and raise ValidationError if they differ -> Option A
  4. Quick Check:

    Use clean() for multi-field validation [OK]
Hint: Use clean() method for comparing multiple fields [OK]
Common Mistakes:
  • Trying to compare fields in clean_password
  • Relying only on client-side JavaScript
  • Adding validators that can't access other fields