Метод 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, помните об этом (упрощенном) потоке проверки:
form.is_valid()
проверить, еслиnot form.errors
form.errors
вызыватьform.full_clean()
form.full_clean()
очистить каждое отдельное поле и после вызватьform.clean()
Поэтому, если вы хотите понять, что происходит, отладьте значение form.is_valid()
и form.errors
.