【问题标题】:How to make a customizable user survey in Django如何在 Django 中进行可定制的用户调查
【发布时间】:2010-11-06 02:44:22
【问题描述】:

我正在为一家公司制作一个系统,该系统除其他外必须包含有关各种事物的令人满意程度的信息,我已经使用具有固定问题和答案的固定模型使其正常工作,但我确信他们需要更改或添加问题。

所以我想创建一个系统,用户可以在其中创建由他们定义的自定义问题组成的自定义评估模式。我该如何进行这样的设计?

现在我的模型是这样的,但是错了:

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 没用,因为您仍然必须自己选择所有问题和答案 - 它不会显示仅与所选架构相关的问题的列表。

【问题讨论】:

    标签: django django-models django-admin survey


    【解决方案1】:

    Django-crowdsourcing 是 django-survey 的一个分支,自 2012 年起得到积极维护,目标是 Django 1.2+。

    【讨论】:

      【解决方案2】:

      我认为你的模型很好。我使用 Django 管理员创建了一个带有 EvaluationQuestions 的 EvaluationScheme,然后我创建了一个 Evaluation 并且我能够回答它的问题。这是我用来与您的模型一起使用的代码:

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

      【讨论】:

      • 感谢您的贡献 - 但问题是当您添加多个评估方案时 - 您可以回答所有问题,而不仅仅是与创建的方案相关的问题。至少这是我在使用管理界面时遇到的问题。但也许我需要在这些表单上做一些 AJAX。
      • 如果你在这里使用我的代码,你不应该有这个问题。我的代码中的关键行是“for question in evaluation.scheme.evaluationquestion_set.all()”,它只抓取与该评估方案相关的那些问题。如果您的代码没有这样的行,那么您将遇到您报告的问题。
      【解决方案3】:

      不是 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)
      

      【讨论】:

        【解决方案4】:

        你检查过django-survey吗?挺好看的。

        【讨论】:

          猜你喜欢
          • 2021-04-25
          • 2012-04-09
          • 2014-07-10
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多