0

djangoでアンケートサイトを作っています。私はdjangoのかなりの初心者なので、うまく説明できない場合は事前に謝罪してください。私の質問は、次のモデルに焦点を当てています。

class SurveyType(models.Model):

    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name    

class Question(models.Model):

    ANSWERTYPE_CHOICES = (
        (u'T', u'Text'),
        (u'R', u'Range'),
        (u'M', u'Media'),
    )

    question = models.CharField(max_length=200)

    surveytype = models.ForeignKey(SurveyType)

    answertype = models.CharField(max_length=1, choices=ANSWERTYPE_CHOICES)

    order = models.IntegerField(default=0)

    def __unicode__(self):
        return self.question        


class Survey(models.Model):

    course = models.ForeignKey(Course)

    surveytype = models.ForeignKey(SurveyType)

    def __unicode__(self):
        return u"%s %s" % (self.course, self.surveytype) 

class Answer(models.Model):

    answer = models.CharField(max_length=400)

    survey = models.ForeignKey(Survey)

    question = models.ForeignKey(Question)

    def __unicode__(self):
        return self.answer

Django は調査 ID を受け取ります。調査 ID を使用して調査タイプを取得し、表示する必要がある質問を表示します。

def survey(request, survey_id):
    survey_data = get_object_or_404(Survey, pk=survey_id)
    survey_type = survey_data.surveytype
    questions = Question.objects.all().filter(surveytype = survey_type).order_by('order')

フォームセットに関するdjangoのドキュメントを読みましたが、forms.pyに何を書かなければならないのか理解できません。そのため、views.pyでフォームを呼び出して、質問を表示するテンプレートでフォームをレンダリングし、回答モデルの回答。

事前に感謝し、私の英語で申し訳ありません.

4

2 に答える 2

1

モデルフォームとフロアループを使用して解決しました。

Models.py

class Question(models.Model): 
    question = models.CharField(max_length=200)
    surveytype = models.ForeignKey(SurveyType)
    answertype = models.ForeignKey(ContentType,
    limit_choices_to = Q(name='text answer', app_label='surveys')| \
    Q(name='media answer', app_label='surveys')| \
    Q(name='range answer', app_label='surveys'))

class RangeAnswer(models.Model):
    answer = models.IntegerField(max_length=1, choices=CHOICES_RANGE, default=0)
    def __unicode__(self):
        return u'%s'%(self.answer)

class TextAnswer(models.Model):
    answer= models.CharField(max_length=200)
    def __unicode__(self):
        return u'%s'%(self.answer)

class MediaAnswer(models.Model):
    answer= models.ForeignKey(Media)
    def __unicode__(self):
        return u'%s'%(self.answer)

Forms.py

class RangeAnswerForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(RangeAnswerForm, self).__init__(*args, **kwargs)
        self.fields['answer'].label = "Mi valoración"    
    class Meta:
        model = RangeAnswer
        widgets = {
            'answer': forms.RadioSelect(renderer=RadioRenderer)
        } 
RangeAnswer.form = RangeAnswerForm

class MediaAnswerForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MediaAnswerForm, self).__init__(*args, **kwargs)
        self.fields['answer'].label = "Medio"    
    class Meta:
        model = MediaAnswer
MediaAnswer.form= MediaAnswerForm

class TextAnswerForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TextAnswerForm, self).__init__(*args, **kwargs)
        self.fields['answer'].label = "Respuesta"    
    class Meta:
        model = TextAnswer
TextAnswer.form = TextAnswerForm

Views.py

for q in questions :
    q.form = q.answertype.model_class().form(prefix="%s"%q.id)
于 2012-05-11T17:47:09.063 に答える
0

フォームを views.py にインポートしましたか?

その後、フォームをテンプレートに渡すビューを作成するだけです。

たとえば、views.py で

def your_form(request):
    form = RegisterForm()
    return render_to_response('your_template.html', {'form': form}, RequestContext(request))

次に、テンプレートで、次のように記述するだけでフォームをレンダリングできます

{{ form }}
于 2012-04-07T13:30:09.567 に答える