2009-06-26 6 views
11

Ich mache ein System für ein Unternehmen, das unter anderem müssen Informationen über das zufrieden stellendes Niveau über verschiedene Dinge halten, ich habe es gut funktioniert ein festes Modell mit festen Fragen und Antworten mit aber ich bin mir sicher, dass sie Fragen ändern oder hinzufügen müssen.Wie eine anpassbare Benutzerumfrage in Django machen

Also möchte ich ein System erstellen, in dem Benutzer benutzerdefinierte Bewertungsschemas erstellen können, die aus benutzerdefinierten Fragen bestehen, die von ihnen definiert werden. Wie mache ich ein solches Design?

Im Moment ist mein Modell das, aber falsch:

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) 

Dies ist eine Art, was ich will, mit der Ausnahme, dass die EvaluationScheme nutzlos ist, da man immer noch alle Fragen zu bieten hat und Antworten selbst - es tut Zeigen Sie keine Liste nur der Fragen an, die sich auf das Schema der Auswahl beziehen.

Antwort

5

Ich denke, Ihre Modelle sind in Ordnung. Ich habe den Django-Administrator benutzt, um einen EvaluationScheme mit EvaluationQuestions zu erstellen, dann habe ich eine Evaluation erstellt und konnte ihre Fragen beantworten. Hier ist der Code, den ich verwenden, um mit Ihren Modellen zu gehen:

# 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> 
+0

Vielen Dank für Ihren Beitrag - aber das Problem ist, wenn Sie mehr als ein EvaluationScheme hinzufügen - dann können Sie alle Fragen beantworten, nicht nur die Fragen im Zusammenhang mit dem erstellten Schema. Zumindest ist das das Problem, das ich bei der Verwendung der Verwaltungsschnittstelle habe. Aber vielleicht muss ich etwas AJAX auf diesen Formen machen. –

+0

Wenn Sie meinen Code hier verwenden, sollten Sie dieses Problem nicht haben. Die Schlüsselzeile in meinem Code ist "for question in evaluation.scheme.evaluationquestion_set.all()", die nur diejenigen Fragen erfasst, die sich auf das Schema für diese Auswertung beziehen. Wenn Ihr Code keine solche Zeile hat, haben Sie das Problem, das Sie melden. – krubo

1

kein django Experte so möchten Sie vielleicht für eine Erfahrung Person warten, um zu antworten, aber man könnte so etwas wie versuchen:

EvaluationQuestions.objects.filter(evaluationscheme__title="myscheme").select_related() 

auch Könnte die Beziehungen setzen umgekehrt, hängt ab, wie Sie brauchen, um auf die Daten zugreifen.

class EvaluationScheme(models.Model): 
    title = models.CharField(max_length=200) 
    evaluations = models.ManyToMany(Evaluation) 
    questions = models.ManyToMany(EvaluationQuestions) 
3

Django-crowdsourcing ist ein Fork von django-Umfrage, die aktiv ab dem Jahr 2012 aufrecht erhalten wird und zielt auf Django 1.2+.