Как сделать триггеры в бэкэнде с Django? - PullRequest
1 голос
/ 16 мая 2019

Я занимаюсь разработкой личного проекта, в котором учительские учетные записи могут создавать собственные экзамены с несколькими вариантами ответов для учетных записей учащихся.Одним из атрибутов класса экзамена является exam_time, целочисленный атрибут, который определяет, сколько минут предоставляется студентам при сдаче экзамена.Когда ученик начинает проводить экзамен, в классе ученика есть два важных поля, одно из которых running_exam, которое устанавливает идентификатор экзамена, который студент в настоящее время проводит, а другое - exam_time, целое число, в котором хранится количество секунд.осталось для этого студента.

def start_exam(request, exam_id):
    exam = Exam.objects.get(id=exam_id, students=Student.objects.get(email=request.user.email))
    if exam:
        Student.objects.filter(email=request.user.email).update(
            doing_exam=exam.id,
            exam_time=exam.time*60,
        )
        return etc...

Теперь мне нужен способ вызывать событие для каждой секунды, чтобы обновить поле exam_time студента, вычитая -1 для каждой секунды и проверяя, не находится ли оно в 0.Другим способом было бы сделать это с помощью JavaScript, но он, возможно, очень уязвим, так как это чистый интерфейс.Предложения?

1 Ответ

1 голос
/ 16 мая 2019

Вы можете сделать это с помощью jQuery.Что-то вроде:

<script>
var duration = {{ exam_time }} * 100
var qTimer = duration, seconds, dispms;

function startTimer(duration, display) {
    questionTimer = setInterval(function () {
        seconds = parseInt(qTimer / 100, 10);
        dispms =  parseInt(qTimer % 100, 10);
        seconds = seconds < 10 ? "0" + seconds : seconds;
        dispms = dispms < 10 ? "0" + dispms : dispms;

        display.textContent =  seconds+":"+dispms;

        if (--qTimer < 0) {
            clearInterval(questionTimer);
            display.textContent = "";
            qTimer = -1;
            window.location = {% url 'next-screen' %}
        }
    }, 10);
}

var display = document.querySelector('#time'); /* time is an id for a span/div where the time remaining is displayed */
startTimer(duration, display);

</script>
...