Как сделать настраиваемый опрос пользователей в 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)
Это вроде того, что я хочу, за исключением того, что оценочная схема бесполезна, так как вам все равно придется выбирать все вопросы и ответы самостоятельно - она не отображает список только вопросов, связанных со схемой выбора.
4 ответа:
Я думаю, что ваши модели в порядке. Я использовал администратора Django для создания EvaluationScheme с оценочными вопросами, затем я создал оценку и смог ответить на ее вопросы. Вот код, который я использовал для ваших моделей:
# 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>
Вы проверили django-survey ? Все очень аккуратно.
Django-crowdsourcing является развилкой django-survey, которая активно поддерживается с 2012 года и нацелена на Django 1.2+.
Не эксперт по Джанго, поэтому вы можете подождать ответа более опытного человека, но вы можете попробовать что-то вроде:
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)