Как настроить пользовательский опрос в Django
Я создаю систему для компании, которая, помимо прочего, должна содержать информацию об удовлетворительном уровне о разных вещах, я заставил ее работать нормально, используя фиксированную модель с фиксированными вопросами и ответами, но я уверен, что они понадобятся для изменения или добавления вопросов.
Итак, я хочу создать систему, в которой пользователи могут создавать настраиваемые схемы оценки, состоящие из настраиваемых им заданных вопросов. Как мне сделать такой дизайн?
Сейчас моя модель - это, но неправильно:
RATING_CHOICES = ((0, u"Good"), (1, u"Bad"), (2, u"Dunno"),)
class EvaluationScheme(models.Model):
title = models.CharField(max_length=200)
class Evaluation(models.Model):
doctor = models.CharField(max_length=200)
agency = models.CharField(max_length=200)
scheme = models.ForeignKey(EvaluationScheme)
class EvaluationQuestion(models.Model):
question = models.CharField(max_length=200)
evaluation = models.ForeignKey(EvaluationScheme)
def __unicode__(self):
return self.question
class EvaluationAnswer(models.Model):
evaluation = models.ForeignKey(Evaluation)
question = models.ForeignKey(EvaluationQuestion)
answer = models.SmallIntegerField(choices=RATING_CHOICES)
Это то, что я хочу, за исключением того, что EvaluationScheme бесполезен, поскольку вам все равно придется выбирать все вопросы и ответы самостоятельно - он не отображает список только вопросов, связанных с выбранной схемой.
Ответы
Ответ 1
Я думаю, что ваши модели в порядке. Я использовал администратор Django для создания EvaluationScheme с EvaluationQuestions, затем создал оценку, и я смог ответить на ее вопросы. Здесь код, который я использовал для ваших моделей:
# forms.py:
from django.forms.models import inlineformset_factory
import models
AnswerFormSet = inlineformset_factory(models.Evaluation,
models.EvaluationAnswer, exclude=('question',),
extra=0, can_delete=False)
# views.py
from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
import models, forms
def prepare_blank_answers(evaluation):
for question in evaluation.scheme.evaluationquestion_set.all():
answer = models.EvaluationAnswer(evaluation=evaluation,
question=question)
answer.save()
def answer_form(request, id):
evaluation = get_object_or_404(models.Evaluation, id=id)
if len(evaluation.evaluationanswer_set.all()) == 0:
prepare_blank_answers(evaluation)
if request.method == 'POST':
formset = forms.AnswerFormSet(request.POST, instance=evaluation)
if formset.is_valid():
formset.save()
return HttpResponse('Thank you!')
else:
formset = forms.AnswerFormSet(instance=evaluation)
return render_to_response('answer_form.html',
{'formset':formset, 'evaluation':evaluation})
# answer_form.html:
<html><head></head><body>
Doctor: {{ evaluation.doctor }} <br>
Agency: {{ evaluation.agency }}
<form method="POST">
{{ formset.management_form }}
<table>
{% for form in formset.forms %}
<tr><th colspan="2">{{ form.instance.question }}</th></tr>
{{ form }}
{% endfor %}
</table>
<input type="submit">
</form>
</body></html>
Ответ 2
Вы отметили django-survey? Это довольно аккуратно.
Ответ 3
Django-crowdsourcing - это вилка django-survey, которая активно поддерживается с 2012 года и нацелена на Django 1.2 +.
Ответ 4
Не эксперт по django, поэтому вы можете подождать, пока более опытный человек ответит, но вы можете попробовать что-то вроде:
EvaluationQuestions.objects.filter(evaluationscheme__title="myscheme").select_related()
Также можно установить отношения по-другому, зависит от того, как вам нужно получить доступ к данным.
class EvaluationScheme(models.Model):
title = models.CharField(max_length=200)
evaluations = models.ManyToMany(Evaluation)
questions = models.ManyToMany(EvaluationQuestions)