Django реализация теста
подскажите как реализовать добавление теста через формы , что бы можно было добавлять вопросы и к ним варианты ответов
models.py
class Tests(models.Model):
owner = models.ForeignKey('Profile', on_delete=models.CASCADE)
title = models.CharField(max_length=150)
questions = models.ManyToManyField('Question', blank=True, )
max_points = models.FloatField(default=0)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('test',kwargs={'pk': self.pk})
class Question(models.Model):
# test = models.ForeignKey(Tests, on_delete=models.CASCADE)
title = models.CharField(max_length=150)
visible = models.BooleanField(default=True)
def __str__(self):
return " {} , Тест {} ".format(self.title,self.test.title)
def get_absolute_url(self):
return reverse('detail',kwargs={'pk': self.pk})
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
title = models.CharField(max_length=4096)
points = models.FloatField(default=1)
lock_other = models.BooleanField(default=False)
def __str__(self):
return "{} {}".format(self.title,self.question)
class Answer(models.Model):
# user = models.ForeignKey('Profile', on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.choice.title
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(null=True)
about = models.TextField(max_length=500,null=True, blank=True)
birthday = models.DateField(null=True, blank=True)
create_test = models.ForeignKey(Tests,null=True,blank=True, on_delete=models.DO_NOTHING)
complete = models.ManyToManyField(Tests, blank=True, related_name='complete')
def __str__(self):
return self.user.username
view.py
class CreateTest(CreateView):
model = Tests
form_class = AddTestForm
template_name='addtest.html'
def form_valid(self, form):
test = form.save(commit=False)
test.owner = Profile.objects.get(user=self.request.user)
test.save()
return redirect('/add/question/')
class CreateQuestion(CreateView):
model = Question
form_class = formset_factory(AddquestionsForm)
template_name='addtest.html'
# class CreateQuestion(CreateView):
# model = Question
# form_class = formset_factory(AddquestionsForm)
# template_name='addtest.html'
forms.py
class AddTestForm(forms.ModelForm):
class Meta:
model=Tests
fields=('title',)
class AddquestionsForm(forms.ModelForm):
class Meta:
model = Question
fields = ['title',]
class AddchoiceForm(forms.ModelForm):
class Meta:
model = Choice
fields = ('title','points',)
Ответы (1 шт):
Автор решения: Andrew Holovko
→ Ссылка
- Делаете формы, для ваших моделей, например:
# forms.py
class AddquestionsForm(forms.ModelForm):
class Meta:
model = Choice
fields = ['question', 'title', 'points', 'lock_other']
- Делаете ссылку и всьюшку для ваших форм:
# views.py
def get_name(request):
if request.method == 'POST':
form = AddquestionsForm(request.POST)
if form.is_valid():
return HttpResponse('/thanks/')
else:
form = AddquestionsForm()
return render(request, 'home.html', {'form': form})
# urls.py
urlpatterns = [
path('add_questions', views.get_name),
]
- Также делаете html которий будет отображать форму
{{ html | safe }}
<form action="" method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Присоедениться</button>
</form>
- Переходите по урлу - вуоля, форма готова. Заполняете - ответы сохраняются в БД
Ссылка на официальную документацию: https://docs.djangoproject.com/en/3.1/topics/forms/