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",
    ),
)
Вернуться на верх