【问题标题】:Django formsetsDjango 表单集
【发布时间】:2012-04-07 13:21:06
【问题描述】:

我正在用 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 中的表单来在显示问题的模板中呈现 de form并在答案模型中写出答案。

在此先感谢,对不起我的英语。

【问题讨论】:

    标签: django django-forms formsets


    【解决方案1】:

    使用 modelforms 和 foo 循环解决。

    模型.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)
    

    【讨论】:

      【解决方案2】:

      您是否将表单导入到您的 views.py 中?

      之后,您只需创建一个将表单传递给模板的视图。

      例如在views.py中

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

      然后在您的模板中,您只需编写即可呈现表单

      {{ form }}
      

      【讨论】:

      • 是的,但问题是我不知道在forms.py中写什么。 Django 文档展示了如何处理使用一个或两个模型而不是四个 :S 的表单。我遇到的问题是创建 form.py
      猜你喜欢
      • 2011-12-11
      • 2020-11-17
      • 2018-02-08
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2010-12-10
      • 2019-05-15
      • 2012-01-23
      相关资源
      最近更新 更多