Создание викторины в 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 с открытым исходным кодом, как я хочу, чтобы узнать, как это было сделано или использовать его для моего личного веб-сайта ;)
Спасибо!