Как в Django передавать переменные, функциии отслежить это

Здравствуйте есть Django проект, и я хочу чтобы в первое поле пользователь вводил количество примеров, во второе сложность, и как только он нажал кнопку отправить, вызывался python скрипт. Данный скрипт написан. Затем выскакивают примеры на сайте, и пользователь в форму которая будет ниже вводит ответ, и опять же это всё отправляется в python скрипт, и он выдает информацию от туда.

введите сюда описание изображения

Вот сюда надо вводить ответ, и после нажатия кнопки отправить, что бы данные проверки выдались на сайт.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Дмитрий

Как может быть задача представлена?

  1. У вас есть Model, Template и View (про MTV можно почитать здесь)
  2. У вас есть некоторая логика, которая должна быть реализована
  3. У вас возникает вопрос: как она должна быть реализована, или куда размещать логику, или как с ней обращаться?

Итак, есть несколько вариантов решения данной задачи. В основном в учебниках по Django рассматривается вариант размещения логики во Views.py.

Например, views.py:

def detail(request):
    if request.method == "POST": # при методе post из template
         data = request.POST     # сохраним все переданные данные в переменную
         any_function(data)      # вызовем какую-то функцию/логику с данными
         amount = data["how_many"]  # например получим количество вопросов
         context = {"amount":amount}
         return render(request, "answers.html", context)
    questions = create_questions()  # вне метода post, т.е. то, что передаем в template
    context = {"questions":questions} # вот здесь передаем в template какие то вопросы
    return render(request, "detail.html", context)

Далее в самом template, то есть в неком html файле мы можем обратиться к переменной questions

Например, detail.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Questions</title>    
</head>
<body>
    {{questions}}
</body>

Т. е. вы передаете некую переменную, которая может содержать одно значение или итерируемое содержание массива и проч. Необходимо понимать, что это просто пример для объяснения реализации и логики. Т. е. html файл не содержит метода post например или во views.py вы не найдете какой либо формы. Это сделано намеренно, чтобы сократить количество строк кода.

Следующий вариант. Можно разместить всю логику в моделях. Т.е. при создании классов модели можно определять методы в самом классе в models.py. Такая реализация во многих случаях очень поленза и решает много вопросов таких как читабельность, понятность и обслуживание кода.

Можно использовать js на стороне клиента для реализации некоторой логики. Например, во views.py в переменной context вы передаете объект модели (некий QuerySet - итерируемый объект или просто экземпляр класса). И организуете работу с этими данными на стороне клиента через javascript. В действительности не очень хорошее решение!

Куда еще прикрепить обработку данных с template/формы? А, почему бы и не в самом forms.py. Такое решение тоже имеет место быть. А, еще и в менеджерах можно использовать!

Итак, что же выбрать и как поступить!? Если ваша логика завязана на request, то самый первый вариант с views.py вполне подходит!

А, далее смотрите сами, но мой личный топ выглядит так, в порядке приоритета:

  1. models.py
  2. forms.py
  3. менеджеры

Хотя тут можно спорить) Если, что то не понятно, то я могу ответить в комментариях. Уточняйте

→ Ссылка