2009-06-26 29 views
11

Tôi đang tạo một hệ thống cho một công ty trong số những thứ khác phải lưu giữ thông tin về mức độ thỏa đáng về nhiều thứ khác nhau, tôi đã làm cho nó hoạt động tốt bằng mô hình cố định với câu hỏi và câu trả lời cố định , nhưng tôi chắc chắn rằng họ sẽ cần phải thay đổi hoặc thêm câu hỏi.Làm cách nào để thực hiện một cuộc khảo sát người dùng có thể tùy chỉnh ở Django

Vì vậy, tôi muốn tạo một hệ thống nơi người dùng có thể tạo các lược đồ đánh giá tùy chỉnh bao gồm các câu hỏi tùy chỉnh được xác định bởi chúng. Làm thế nào để tôi thực hiện một thiết kế như vậy?

Ngay bây giờ mô hình của tôi là thế này, nhưng sai:

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) 

Đây là loại gì tôi muốn, ngoại trừ việc EvaluationScheme là vô ích, vì bạn vẫn phải chọn tất cả các câu hỏi và câu trả lời chính mình - nó không hiển thị danh sách chỉ các câu hỏi liên quan đến giản đồ lựa chọn.

Trả lời

5

Tôi nghĩ rằng mô hình của bạn là tốt. Tôi đã sử dụng quản trị viên Django để tạo một EvaluationScheme với EvaluationQuestions, sau đó tôi đã tạo ra một đánh giá và tôi đã có thể trả lời các câu hỏi của nó. Dưới đây là đoạn code tôi sử dụng để đi với mô hình của bạn:

# 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

Cảm ơn sự đóng góp của bạn - nhưng vấn đề là khi bạn thêm nhiều hơn một EvaluationScheme - sau đó bạn có thể trả lời tất cả các câu hỏi, không chỉ các câu hỏi liên quan đến lược đồ đã tạo. Ít nhất đó là vấn đề tôi gặp phải khi sử dụng giao diện quản trị. Nhưng có lẽ tôi cần phải làm một số AJAX trên những hình thức. –

+0

Nếu bạn sử dụng mã của tôi ở đây bạn không nên có vấn đề đó. Dòng khóa trong mã của tôi là "cho câu hỏi trong evaluation.scheme.evaluationquestion_set.all()" chỉ lấy những câu hỏi liên quan đến lược đồ cho đánh giá này. Nếu mã của bạn không có dòng như vậy, bạn sẽ gặp sự cố bạn báo cáo. – krubo

1

Không phải là một chuyên gia django vì vậy bạn có thể muốn chờ đợi cho một trải nghiệm người hơn để trả lời nhưng bạn có thể thử một cái gì đó như:

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

cũng có thể đặt các mối quan hệ theo cách khác xung quanh, phụ thuộc vào cách bạn cần truy cập dữ liệu.

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

Django-crowdsourcing là một ngã ba của django-khảo sát đang tích cực duy trì như năm 2012 và mục tiêu Django 1.2+.

Các vấn đề liên quan