вывод записей по одному в Django
разрабатываю сайт для проведения тестов, Тесты содержат несколько вопросов. Хочу реализовать функцию прохождения теста таким образом что пользователю сначала выводиться только 1 вопрос, после ответа на него выводиться 2 вопрос и так далее. как лучше реализовать такую функцию.
Предпологаю считывать по Question_id и отдавать их функции для рендера страницы вопросов, но как мне сделать цикл который бы переходил к след вопросу после нажатия на копку
Пытался реализовать представление таким образом, но вот как реализовать кнопку не до конца понимаю
models.py
class Test(models.Model):
test_text = models.CharField(max_length=200)
class Question (models.Model):
test = models.ForeignKey(Test,on_delete=models.DO_NOTHING)
question_text = models.CharField(max_length=500)
more_text = models.CharField(max_length=10000,null=True,blank=True)
class Choice (models.Model):
question = models.ForeignKey(Question,on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
bal = models.IntegerField()
views.py
def questionList(request, question):
return render(request,'polls/tests.html',{'question':question})
def testing(request,test_id):
question = Question.objects.filter(test_id=test_id)
for q in question:
return questionList(request,q)
Ответы (1 шт):
После разных вариантов создания представления решил использовать Pagination из Django. Не заню на сколько извращенный способ получился, однако он рабочий.
Для начала добавил пагинацию в представлении
views.py
from django.core.paginator import Paginator
def test(request,test_id):
test = Test.objects.get(pk=test_id)
q = Question.objects.filter(test_id=test_id)
paginator = Paginator(q,1)
page_num = request.GET.get('page')
page_obj = paginator.get_page(page_num)
return render(request,'polls/test.html',{'page_obj':page_obj,'test':test})
test.html
{%extends 'base.html'%}
{%load static%}
{% block title %}Лекции{% endblock %}
{%block content%}
<div>{{test.title}}</div>
<div>
{%for q in page_obj%}
<form action="{%url 'polls:answer' test.id%}" method="POST">
{%csrf_token%}
<h1>{{q.question_text}}</h1>
{%for c in q.choice_set.all%}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ c.choice_text }}">
<label for="choice{{ forloop.counter }}">{{ c.choice_text }}</label><br>
{%endfor%}
<button type="submit">Ответить</button>
</form>
{%endfor%}
</div>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}"></a>
{% endif %}
<span class="current">
Вопрос {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">след</a>
{% endif %}
</span>
</div>
{%endblock%}
Так же в поиске ответа есть варианты с "Каруселью" Но тк мне нужно обрабатывать формы, мне показалось что пагинация будет удобней и проще
надеюсь кому-то поможет в будущем, или кто нибудь сможет предложить более адекватный способ решения моей проблемы
