Создание викторины в Django

Мне нужно создать викторину в Django и пока я начинаю с раздела Admin.

models.py:

class Answer(models.Model):
    objects = None
    answer = models.CharField(max_length=200, null=False)
    answer_pic = models.ImageField(upload_to='poll', storage=fs)

    def __str__(self):
        return self.answer


class Question(models.Model):
    objects = None
    question = models.CharField(max_length=200, null=False)
    description = models.CharField(max_length=255, null=True)
    question_pic = models.ImageField(upload_to='poll/', storage=fs, null=True)
    choices = models.ManyToManyField(Answer, related_name='QuestionsChoices')
    correct = models.ManyToManyField(Answer, related_name='QuestionsCorrect')
    mandatory = models.BooleanField(default=True)
    multiple = models.BooleanField(default=False)
    randomize = models.BooleanField(default=False)

    def __str__(self):
        return self.question


class Quiz(models.Model):
    objects = None
    STATUS_CHOICES = (
        (1, 'Draft'),
        (2, 'Public'),
        (3, 'Close'),
    )
    nom = models.CharField(max_length=200, null=False)
    questions = models.ManyToManyField(Question, related_name='Quizs')
    status = models.IntegerField(choices=STATUS_CHOICES, default=1)
    published = models.DateTimeField()
    date_added = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.nom

forms.py

views.py

from django.shortcuts import render
from .models import *
from .forms import *
from django.core.files.storage import FileSystemStorage
from django.shortcuts import render, get_object_or_404, redirect
from django.urls.base import reverse
from django.contrib import messages
from django.forms.formsets import formset_factory
from django.db import IntegrityError, transaction


def create_question(request, quiz=None):

    if request.user.is_staff:
        title = "Create Question"
        form = QuestionForm()
        form_answer = AnswerForm()
        previous_page = reverse('poll:quiz-admin')
        formAction = 'poll:create-question'
        AnswerFormSet = formset_factory(AnswerForm, formset=BaseAnswerFormSet)
        answer_formset = AnswerFormSet()

        if request.method == 'POST':
            form = QuestionForm(request.POST, request.FILES)
            answer_formset = AnswerFormSet(request.POST, request.FILES)

            if form.is_valid() and answer_formset.is_valid():
                obj = form.save()
                new_answers = []

                for answer_form in answer_formset:
                    answer = answer_form.cleaned_data.get('answer')
                    answer_pic = answer_form.cleaned_data.get('answer_pic')

                    if answer and answer_pic:
                        new_answers.append(Answer(answer=answer, answer_pic=answer_pic))
                    if answer and answer_pic is None:
                        new_answers.append(Answer(answer=answer, answer_pic=None))
                try:
                    with transaction.atomic():
                        Answer.objects.bulk_create(new_answers)
                        Question.choices = new_answers
                except IntegrityError:  # If the transaction failed
                    messages.error(request, "Problème dans l'ajout des réponses")
                    return redirect(reverse('poll:create-question'))

                if form_answer.cleaned_data['correct']:
                    correct = True
                else:
                    correct = None
                # answer_obj = form_answer.save(question=obj, correct=correct)
                message = "Question créée !"
                messages.success(request, message)
            else:
                message = "Une erreur s'est produite"
                messages.error(request, message)
            return redirect('poll:create-question', quiz=quiz)

        context = {
            'form': form,
            # 'form_answer': form_answer,
            'answer_formset': answer_formset,
            'title': title,
            'formAction': formAction,
            'previous_page': previous_page,
        }
        return render(request, "poll/create_question.html", context)
    else:
        messages.error(request, "Vous n'avez pas les droits !")
        return redirect('poll:quiz-admin')

Я хочу, чтобы при добавлении вопроса был выбор для добавления ответов (Jquery) и при отправке создавался вопрос и ответ и добавлялся ответ в поле ManyToManyField для только что созданного вопроса. Еще одна потребность - выбрать из этих ответов правильный и добавить в "правильное" поле ManyToManyField.

Я пытался использовать некоторые учебники, но у меня возникли проблемы с FileField.

Вопрос может быть только текстовым или иметь поле ImageField (вопрос, описание, изображение и некоторые опции). Ответ - то же самое. Это может быть только текст или текст + изображение (или только изображение) (Ответ, Изображение). Конечно, я могу после создания вопроса перейти на другую страницу шаблона и добавить ответ, связанный с последним добавленным вопросом... Но я хотел бы сделать как typeform.com, например, или любой другой сайт викторины, чтобы создать все на одной странице.

Спасибо за помощь или если у вас есть Django Quiz с открытым исходным кодом, как я хочу, чтобы узнать, как это было сделано или использовать его для моего личного веб-сайта ;)

Спасибо!

Вернуться на верх