0

私はアプリケーションを実行していますが、ユーザーが評価できるようにする必要があります。私の問題は、フォームセットを使用して、それぞれの選択肢を含む質問をリストしたいということです。フォームセットを使用してこれを実行できることはわかっていますが、それを成し遂げるために。以下は私のコードです:

# models.py

class Evaluation(models.Model):
    """
    An evaluation is for a session.
    Each session should have an evaluation
    """
    session = models.OneToOneField(
        Session,
        related_name='evaluation',
        verbose_name=u'Sesión'
    )

    class Meta:
        verbose_name = u'Evaluación'
        verbose_name_plural = u'Evaluaciones'

    def __unicode__(self):
        return u'Evaluación de la sesion {0}'.format(
            self.session.name
        )


class Question(models.Model):
    """
    A question inside of an evaluation
    """
    evaluation = models.ForeignKey(
        Evaluation,
        verbose_name=u'Evaluación',
        related_name='questions'
    )
    question_type = models.CharField(
        max_length=20,
        verbose_name=u'Tipo de respuesta',
        choices=QUESTION_TYPES
    )
    sentence = models.CharField(
        max_length=255,
        verbose_name=u'Pregunta'
    )
    position = models.IntegerField(
        default=0,
        verbose_name=u'Posición'
    )

    class Meta:
        verbose_name = u'Pregunta'
        verbose_name_plural = u'Preguntas'
        ordering = ['position', 'sentence']

    def __unicode__(self):
        return self.sentence


class Choice(models.Model):
    question = models.ForeignKey(
        Question,
        related_name='choices',
        verbose_name=u'Pregunta'
    )
    sentence = models.CharField(
        max_length=255,
        verbose_name=u'Posible respuesta'
    )
    position = models.IntegerField(
        default=0,
        verbose_name=u'Posición'
    )

    class Meta:
        verbose_name = u'Posible respuesta'
        verbose_name_plural = u'Posibles respuestas'
        ordering = ['position', 'sentence']

    def __unicode__(self):
        return self.sentence

----

# forms.py

from django.forms.models import inlineformset_factory
from models import Evaluation, Question


AnswerFormSet = inlineformset_factory(
    Evaluation, Question, exclude=('question',),
    extra=0, can_delete=False
)

----

# views.py

@login_required()
def session_evaluation(request, course_slug, session_position):
    data = {}
    course = get_object_or_404(Course, slug=course_slug)
    session = Session.objects.filter(course=course).get(position=session_position)
    evaluation = get_object_or_404(Evaluation, session=session)
    if request.method == 'POST':
        formset = AnswerFormSet(request.POST, instance=evaluation)
        if formset.is_valid():
            formset.save()
            print 'formset valid...'
    else:
        formset = AnswerFormSet(instance=evaluation)
    data['course'] = course
    data['session'] = session
    data['formset'] = formset
    return render(request, 'courses/session_evaluation.html', data)

----

# template.html
<form id="evaluation" method="post" role="form">
    {% csrf_token %}
    {{ formset.management_form }}
    <ul class="evaluation">
        {% for form in formset.forms %}
            <li>
                {{ form.instance }}
                {{ form.instance.choices.all }}
            </li>
        {% endfor %}
    </ul>
    <div class="form-group clearfix nmb">
        <button type="submit" class="btn btn-primary pull-right">Enviar respuestas</button>
    </div>
</form>

ご覧のとおり、モデルは適切に作成されていますが、フォームから見ると、すべてのコードは単なる実験であり、その方法は本当にわかりません。

このコードでテンプレートに取得しているのは、次のような質問文と選択肢のリストです。

[question sentence here]? [<Choice: [choice #1 here]>, <Choice: [choice #2 here]>] 

フォームセットでそれを行うクリーンで簡単な方法は何ですか?

私が取得したいのは、これが評価であるため、ラジオ ボタンを使用したそれぞれの選択肢のリストを含む質問のリストです。

4

1 に答える 1

0

またはすべきではありません{{ form.as_p }}{{ form.as_table }}?インスタンスは既にビューで作成されているため、テンプレートで使用する必要はありません。

于 2013-11-26T00:39:33.737 に答える