title: django clean method is not being called when validating form
body: <p>I tried the simplest way of form validation I could find using the clean method (I need to validate multiple fields). However, it is not working and it is not throwing any errors.</p>
  <p><strong>forms.py</strong></p>
  <pre><code>class DOEForm1(ModelForm):
  class Meta:
      model = Doe
      labels = {
          'column_parameter': ('Parameter to vary'),
          'column_min': ('Minimum value'),
          'column_max': ('Maximum value'),
          'column_step': ('Step value'),
      }
      exclude = ('substrate','row_parameter','row_min','row_max','row_step',)
      def clean(self):
          cleaned_data = super().clean()
          print('test')
          min = cleaned_data.get('column_min')
          max = cleaned_data.get('column_max')
          step = cleaned_data.get('column_step')
          if min and max and step:
              if not (int(step) &gt; 10):
                  raise ValidationError(
                  '(!) the parameters you inputted dont go well with the substrate size' 
                  )
          return cleaned_data
  </code></pre>
  <p><strong>template</strong></p>
  <pre><code>{%  extends 'accounts/main.html' %}
  {% load static %}
  {% block content %}
  &lt;br&gt;
  &lt;div class=&quot;row&quot; style = &quot;padding-left: 15px; width: 500px; margin: auto;&quot;&gt;
      &lt;div class=&quot;col&quot; style = &quot;margin: auto; &quot;&gt;
          &lt;div class=&quot;card card-body&quot;&gt;
              &lt;form style = &quot;margin: auto; width: 400px; padding: 20px; border: 1px solid #270644;&quot; action=&quot;&quot; method=&quot;POST&quot;&gt;
                  {% csrf_token %}
                  &lt;table&gt;
                      {{ St_form.as_table }}
                      {{ DOE_form.as_table }}
                  &lt;/table&gt;
                  {% for error in form.non_field_errors %}
                  &lt;p class = &quot;help is-danger&quot;&gt;{{ error }}&lt;/p&gt;
                  {% endfor %}
                  &lt;input type=&quot;submit&quot; name=&quot;Submit&quot; &gt;
              &lt;/form&gt;
         &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;
  
  
  {% endblock %}
  </code></pre>
  <p><strong>views.py</strong></p>
  <pre><code>def ST_parameters(request):
      st_form = STForm()
      doe_form = DOEForm1()
      if request.method == 'POST':
          #print('Printing POST: ', request.POST)
          st_form = STForm(request.POST)
          doe_form = DOEForm1(request.POST)
          if st_form.is_valid() and doe_form.is_valid():
              st = st_form.save()
              doe = doe_form.save(False)
  
              doe.st=st 
              doe.save()
              return redirect('user-page')
      context ={'St_form':st_form,'DOE_form':doe_form}
      return render(request, 'accounts/ST_form.html',context)
  </code></pre>
  <p><strong>models.py</strong></p>
  <pre><code>class Doe(models.Model):
      LASER_POWER = &quot;Laser Power&quot;
      LASER_SPEED = &quot;Laser speed&quot;
      POWDER_FEED=&quot;Powder feed rate&quot;
      CARRIER_GAS = &quot;Carrier gas&quot;
      SHIELD_GAS = &quot;Shield gas&quot;
      SPOT_DIAMETER = &quot;Spot Diameter&quot;
      NOZZLE_STANDOFF = &quot;Nozzle standoff&quot;
      PARAMETER_CHOICES = [
          (LASER_POWER, &quot;Laser Power&quot;),
          (LASER_SPEED, &quot;Laser Speed&quot;),
          (POWDER_FEED, &quot;Powder feed rate&quot;),
          (CARRIER_GAS, &quot;Carrier Gas&quot;),
          (SHIELD_GAS,&quot;Shield Gas&quot;),
          (SPOT_DIAMETER,&quot;Spot Diameter&quot;),
          (NOZZLE_STANDOFF, &quot;Nozzle Standoff&quot;)
      ]
      doe_id = models.AutoField(db_column='DoE_ID', primary_key=True)  
      substrate = models.ForeignKey('Substrate', models.SET_NULL, db_column='Substrate_ID', blank=True, null=True)  # Field name made lowercase.
      row_parameter = models.CharField(max_length=45, choices = PARAMETER_CHOICES,default = LASER_POWER, blank=True, null=True)
      row_min = models.CharField(max_length=45, blank=True, null=True)
      row_max = models.CharField(max_length=45, blank=True, null=True)
      row_step = models.CharField(max_length=45, blank=True, null=True)
      column_parameter = models.CharField(max_length=45,choices = PARAMETER_CHOICES,default = LASER_POWER, blank=True, null=True)
      column_min = models.CharField(max_length=45, blank=True, null=True)
      column_max = models.CharField(max_length=45, blank=True, null=True)
      column_step = models.CharField(max_length=45, blank=True, null=True)
  
      class Meta:
          db_table = 'doe'
  </code></pre>
  <p>What am I doing wrong here?</p>