Python Как написать тест. Подскажите направление
Хочу вот такой соционический тест для тренировки на Python сделать.
Там 68 вопросов, каждый раз по выбору радиокнопки , попадаем на новые варианты. А в самом конце, когда на все вопросы ответил в зависимости от выбранных вариантов он показывает соционический тип и в зависимости от ответов уровень интоверсии- экставерсии, логики и этики итд. + описание тима.
ссылка на сам тест https://www.tests-tests.com/gulenko.php?qnum=1 Подскажите направление пожалуйста как это оптимальней всего сделать? Какую лучше использовать библиотеку? Использовать Django формы в связки с моделями или что-то другое? И самое главное. Есть ли сайт если я например захочу примеры таких проектов посмотреть у других людей ? Чтобы такие вопросы тут не спрашивать.GitHub вроде не подошёл.
Ответы (2 шт):
Как вариант использовать Django, да. В этом случае вижу реализацию так:
- Пользователь заходит на сайт и получает сессию. В нее положим словарь из 68 пустых ячеек, пронумеровав каждую для конкретного вопроса.
- Создадим словарь так же под каждый вопрос, но в словарь поместим кортеж в виде ответ/количество баллов.
- В шаблоне сделаем простенькую форму с общими элементами управления.
- После выбора какого-то значения в форме и жмак по кнопке будет отправлять в Django GET-запросы с номером ответа (или кол-ом баллов за него). Сама же форма будет формироваться из словаря с вопросами/баллами.
- Теперь со стороны сервера в сессионную переменную (ранее созданный список) добавляем кол-во баллов и перемещаем на следующий не отвеченный вопрос.
- Когда на все вопросы получены ответы необходимо по какой-то формуле (тут уже сами, исходя из вопросов) просчитать и по полученному значению вернуть какой-то результат.
Естественно, все это тезисно. Бонусом можно докидать всякие элементы по типу "Сохранить результат", "Поделиться", "Пройти еще раз", но это уже вкусовщина.
Накидал быстренько так. Потестил, вроде работает.
views.py
from django.shortcuts import render, redirect, HttpResponse
# Переменная с вопросами и ответами/баллами
my_quests = {
1:['Выберите любое число', ['Два', 0],['Семь', 1],['Восемь', 2]],
2:['Выберите любой цвет', ['Красный', 0],['Желтый', 1],['Синий', 2]],
3:['Выберите любое животное', ['Корова', 0],['Носорог', 1],['Жираф', 2]],
4:['Выберите то, что нельзя выбрать', ['Можно выбрать', 0],['Нельзя выбрать', 1]],
5:['Попробуйте ничего не выбрать', ['Выбрать', 0],['Не выбрать', 1]],
}
# Отвечает за формирование элементов в форме
def render_form (number):
HTML_='<input name="page" value="'+str(number)+'" hidden><h3>'+my_quests[number][0]+'</h3>'
for row in my_quests[number][1:len(my_quests[number])]:
HTML_+='<p>'+row[0]+' <input name="result" value="'+str(row[1])+'" type="radio"></p>'
return HTML_
# Основной обработчик
def index(request):
data={'form_':''}
# Если в сессии нет нужных переменных, то создаем
if 'quest' not in request.session:
request.session['quest']={}
request.session['result'] = 0
index = 1
for row in my_quests:
request.session['quest'][index]=None
index +=1
request.session.modified = True
# Если нам пришел ответ, то считаем его
if 'result' in request.GET:
request.session['result'] += int (request.GET['result'])
request.session['quest'][request.GET['page']] = 'Done'
request.session.modified = True
print (request.session['quest'])
if 'page' not in request.GET:
return redirect ('/test/?page=1')
else:
# Если был получен ответ на этот вопрос, то идем дальше
if request.session['quest'][request.GET['page']] != None:
next_page = int(request.GET['page'])+1
# Если на все вопросы даны ответы, то возвращаем результат
if next_page-1>=len(my_quests):
return HttpResponse ('Вы завершили тестирование и набрали '+str(request.session['result'])+' баллов!')
return redirect ('/test/?page='+ str(next_page))
else:
# Рендерим форму
data['form_']=render_form (int(request.GET['page']))
return render (request, 'index.html', data)
Файлик с шаблоном index.html
<html>
<head>
<title>Тестирование</title>
</head>
<body>
<form method="GET">
<p>{{ form_|safe }}</p>
<p><button>Ответить</button></p>
</form>
</body>
</html>
Естественно, вопросов может быть больше, количество ответом больше/меньше, а на строке return HttpResponse ('Вы завершили тестирование... рекомендую добавить функцию, которая по количеству набранных баллов будет возвращать результат.
ЗЫ: Код постарался сделать максимально гибким, чтобы править пришлось только переменную my_quests

