Django -- Проверка типа ввода, отображение сообщения об ошибке в случае ошибки
Я новичок в изучении Django/Python и надеюсь на помощь. Это нужно для задания, и я застрял на последней части. Нам нужно принять ввод от пользователя (имя как строка; вес, рост в дюймах и рост в футах как инты) и вычислить bmi, отображая {{name}}'s bmi is {{bmi}}
У меня эта часть работает хорошо, но вторая часть того, что я должен сделать, это проверить, что входные данные действительны, то есть не строка, где это должно быть int, и не отрицательное число. Я должен поместить это в класс. Я читал о функции is_valid(), но я еще не использовал ее и не совсем уверен, как это сделать. Я предполагаю, что это будет оператор if else.
views.py
class Home(View):
def get(self, request):
return render(request, 'home.html')
def post(self, request):
n = str(request.POST["name"])
w = int(request.POST["weight"])
hi = int(request.POST["heightinches"])
hf = int(request.POST["heightfeet"])
h = (hf*12) + hi
bmi = (703*w) / (h*h)
return render(request, 'response.html',{"name":n,"heightinches":hi,"heightfeet":hf,"weight":w,"height":h,"bmi":bmi}
home.html
{% load static %}
<html>
<head><title>Home</title></head>
<body>
<h1>Hello Repl.it</h1>
<form action="" method="post">
{% csrf_token %}
name: <input type="text" name="name" id="name"/> <br>
weight: <input type="text" name="weight" id="weight"/> pounds<br>
height: <input type="text" name="heightinches" id="heightinches"/> inches<br>
<input type="text" name="heightfeet" id="heightfeet"/> feet<br>
<input type="submit"/>
</form>
</body>
</html>
response.html
{% load static %}
<html>
<head><title>Home</title></head>
<body>
{{name}}'s BMI is {{bmi|floatformat:2}}
<p><a href="home.html">Back</a></p>
</body>
</html>
Заранее спасибо за помощь! С моим инструктором не так легко связаться, поэтому я надеюсь, что здесь мне повезет больше :S
Я использую Django уже некоторое время. Django предлагает углубленную библиотеку форм, встроенную в базовую библиотеку Django.
Я бы настоятельно рекомендовал следовать этому руководству по настройке. https://docs.djangoproject.com/en/3.2/topics/forms/
Если вам требуется пользовательская валидация, вы можете добавить функцию в нижнюю часть вашего класса InputForm, чтобы проверить это и поднять ValidationError, если она не проходит:
def check_google_url(self):
url = self.cleaned_data['url']
if "https://google.com" not in url:
raise forms.ValidationError("URL does not match Google! Please copy and paste the full google.com URL.")
else:
return url
После того, как вы установили форму, вы можете использовать crispy forms для определения классов css 'error' и 'required' для этой страницы. Crispy Forms - https://django-crispy-forms.readthedocs.io/en/latest/
self.helper.layout = Layout(
Div(
'negatives',
'positives',
'learnings',
'rating',
css_class="final-feedback",
required_css_class="error",
error_css_class="error",
title="Final Comments",
),
)