2009-06-26 15 views
11

Estoy haciendo un sistema para una empresa que, entre otras cosas, debe contener información sobre el nivel satisfactorio de varias cosas, lo he hecho funcionar bien usando un modelo fijo con preguntas y respuestas corregidas , pero estoy seguro de que tendrán que cambiar o agregar preguntas.Cómo hacer una encuesta de usuario personalizable en Django

Así que quiero hacer un sistema donde los usuarios puedan hacer esquemas de evaluación personalizados que consistan en preguntas personalizadas definidas por ellos. ¿Cómo hago para hacer un diseño así?

En este momento mi modelo es esto, pero equivocada:

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) 

Esta es una especie de lo que quiero, excepto que el EvaluationScheme es inútil, ya que todavía tiene que elegir todas las preguntas y respuestas sobre sí mismo - lo hace no muestra una lista de solo las preguntas relacionadas con el esquema de elección.

Respuesta

5

creo que sus modelos están bien. Usé el administrador de Django para crear un EvaluationScheme con EvaluationQuestions, luego creé una Evaluación y pude responder sus preguntas. Aquí está el código que solía ir con sus modelos:

# 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

Gracias por su contribución, pero el problema es cuando agrega más de un EvaluationScheme, entonces puede responder todas las preguntas, no solo las relacionadas con el esquema creado. Al menos ese es el problema que tengo cuando uso la interfaz de administración. Pero tal vez necesito ir a hacer algunos AJAX en esos formularios. –

+0

Si usa mi código aquí, no debería tener ese problema. La línea clave de mi código es "para preguntas en evaluation.scheme.evaluationquestion_set.all()", que solo recoge las preguntas relacionadas con el esquema de esta evaluación. Si su código no tiene una línea así, tendrá el problema que informa. – krubo

1

No es un experto en Django por lo que es posible que desee esperar a una persona la experiencia más para responder, pero usted podría intentar algo como:

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

También puede poner las relaciones al revés, depende de cómo se necesita acceder a los datos.

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

Django-crowdsourcing es un tenedor de django-encuesta que se mantiene de forma activa a partir de 2012 y se dirige a Django 1.2+.

Cuestiones relacionadas