Метод django clean не вызывается при валидации формы

Я попробовал самый простой способ валидации формы, который смог найти, используя чистый метод (мне нужно проверить несколько полей). Однако он не работает и не выдает никаких ошибок.

forms.py

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) > 10):
                raise ValidationError(
                '(!) the parameters you inputted dont go well with the substrate size' 
                )
        return cleaned_data

шаблон

{%  extends 'accounts/main.html' %}
{% load static %}
{% block content %}
<br>
<div class="row" style = "padding-left: 15px; width: 500px; margin: auto;">
    <div class="col" style = "margin: auto; ">
        <div class="card card-body">
            <form style = "margin: auto; width: 400px; padding: 20px; border: 1px solid #270644;" action="" method="POST">
                {% csrf_token %}
                <table>
                    {{ St_form.as_table }}
                    {{ DOE_form.as_table }}
                </table>
                {% for error in form.non_field_errors %}
                <p class = "help is-danger">{{ error }}</p>
                {% endfor %}
                <input type="submit" name="Submit" >
            </form>
       </div>
    </div>
</div>


{% endblock %}

views.py

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)

models.py

class Doe(models.Model):
    LASER_POWER = "Laser Power"
    LASER_SPEED = "Laser speed"
    POWDER_FEED="Powder feed rate"
    CARRIER_GAS = "Carrier gas"
    SHIELD_GAS = "Shield gas"
    SPOT_DIAMETER = "Spot Diameter"
    NOZZLE_STANDOFF = "Nozzle standoff"
    PARAMETER_CHOICES = [
        (LASER_POWER, "Laser Power"),
        (LASER_SPEED, "Laser Speed"),
        (POWDER_FEED, "Powder feed rate"),
        (CARRIER_GAS, "Carrier Gas"),
        (SHIELD_GAS,"Shield Gas"),
        (SPOT_DIAMETER,"Spot Diameter"),
        (NOZZLE_STANDOFF, "Nozzle Standoff")
    ]
    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'

Что я делаю не так?

Когда вы работаете с Django Forms, помните об этом (упрощенном) потоке проверки:

  1. form.is_valid() проверить, если not form.errors
  2. form.errors вызывать form.full_clean()
  3. form.full_clean() очистить каждое отдельное поле и после вызвать form.clean()

Поэтому, если вы хотите понять, что происходит, отладьте значение form.is_valid() и form.errors.

Вернуться на верх