вывод записей по одному в Django

Рейтинг: 0Ответов: 1Опубликовано: 24.04.2023

разрабатываю сайт для проведения тестов, Тесты содержат несколько вопросов. Хочу реализовать функцию прохождения теста таким образом что пользователю сначала выводиться только 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)

Ответы

▲ 0Принят

После разных вариантов создания представления решил использовать 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%}

выглядит всё таким образом, P.S вопросы не имеют смысла т.к добавил их ради тестов

Так же в поиске ответа есть варианты с "Каруселью" Но тк мне нужно обрабатывать формы, мне показалось что пагинация будет удобней и проще

надеюсь кому-то поможет в будущем, или кто нибудь сможет предложить более адекватный способ решения моей проблемы