2013-04-18 2 views
0

나는 3 개의 기본 모델을 가지고있다. 설문지 모델 또는 질문 집합에는 일련의 질문이 포함되어 있습니다. 모든 사용자 응답은 응답으로 저장됩니다.django 복잡한 formset 문제

이제 설문지 세트의 모든 질문에 대한 답변을 저장할 formset을 생성해야합니다. 어떻게 장고에서 할 수 있습니다. 지금까지 나는 주어진 설문지에서 단 하나의 질문을 한꺼번에 표시하고 응답을 저장함으로써 그것을 수행해야했습니다. 내 문제는 questiontype에 따라 두 개의 다른 modelform (MultipleChoiceAnswerForm, DescriptiveChoiceAnswerForm)을 사용하고 폼 유형에 따라 유효성을 검사한다는 것입니다. 어떻게 formset에서 사용할 수 있습니까?

저는 초보자입니다. 어떤 도움도 받으실 수 있습니다.

내 코드 :

#Models.py 

class Question(models.Model): 
    statement = models.CharField(max_length=255) 
    question_type = models.CharField(max_length=20, choices=get_qtypes()) 
    remarks = models.CharField(max_length=200, null=True, blank=True) 

    def __unicode__(self): 
     return '%s'%(self.statement) 

class Questionnaire(models.Model): 
    title = models.CharField(max_length=255) 
    questionaire_type = models.CharField(max_length=20,choices=QUESTIONNAIRETYPE) 
    context = models.ForeignKey(QuestionContext) 
    questions = models.ManyToManyField(Question) 

    timestamp = models.DateTimeField(auto_now=True) 
    tathya_user = models.ForeignKey(User) 

    def __unicode__(self): 
     return '%s'%(self.title) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    person = models.ForeignKey(Person) 
    course = models.ForeignKey(Course) 
    teacher=models.ForeignKey(Person, null=True, blank=True, default = None) 
    questionaire = models.ForeignKey(Questionnaire) 
    statement = models.CharField(max_length=255) 


    def get_label(self): 
     return '%s'%(self.question.statement) 
    def get_choices(self): 
     return get_questionchoices(self.question.question_type) 

class DescriptiveAnswerForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(DescriptiveAnswerForm, self).__init__(*args, **kwargs) 
     if kwargs.has_key('instance'): 
      self.fields['statement'].label = kwargs['instance'].get_label() 

    statement = forms.CharField(widget=forms.Textarea()) 
    class Meta: 
     model = Answer 
     exclude=('question','person','course','teacher','questionaire') 

class MultipleChoiceAnswerForm(ModelForm): 
    statement = forms.ChoiceField(widget=forms.RadioSelect(choices=EMPTY,attrs={'class': 'allradio',})) 

    def __init__(self, *args, **kwargs): 
     super(MultipleChoiceAnswerForm, self).__init__(*args, **kwargs) 
     if kwargs.has_key('instance'): 
      self.fields['statement'].label = kwargs['instance'].get_label() 
      self.fields['statement'].choices = kwargs['instance'].get_choices() 

    class Meta: 
     model = Answer 
     exclude=('question','person','course','teacher','questionaire') 

################################################################### 
#view.py 
@login_required 
def content_feedback_view_old(request,course_code): 
    #do validation and other jobs 
    questionnaire = get_questionnaire(some_params_like_coursecode) 
    if request.method == 'POST': 
     r_answer = Answer() 
     r_answer.question = Question.objects.get(id=request.session['question']) 
     r_answer.person = student 
     r_answer.course = course 
     r_answer.questionaire = questionnaire 
     r_answer.tathya_user = User.objects.get(id=request.user.pk) 
     rformtype = request.POST['formtype'] 
     if rformtype == 'MCQ': 
      rform = MultipleChoiceAnswerForm(request.POST, instance=r_answer) 
     else: 
      rform = DescriptiveAnswerForm(request.POST, instance=r_answer) 
     if rform.is_valid(): 
      rform.save() 
     else: 
      #return HttpResponse(printerror("Some problem occurred!")) 
      errortext = "You need to provide an input!" 

    questions = questionnaire.questions.all() 
    allquestions = questions.count() 
    tot_q = 0 
    formtype = "" 
    answered = 0 
    for question in questions: 
     try: 
      answer=Answer.objects.get(question=question,person=student,course=course,questionaire=questionnaire) 
      answered += 1 
     except: 
      answer = Answer() 
      answer.question = question 
      answer.person = student 
      answer.course = course 
      answer.questionaire = questionnaire 
      answer.tathya_user = User.objects.get(id=request.user.pk) 
      request.session['question']=question.id 
      tot_q = tot_q + 1; 
      if get_questiontype(question.question_type)=='MCQ': 
       formtype="MCQ" 
       form=MultipleChoiceAnswerForm(instance=answer) 
      else: 
       formtype="DESC" 
       form=DescriptiveAnswerForm(instance=answer) 
      break 
    if tot_q>0: 
     data_dict['FeedbackFormType']=formtype 
     data_dict['FeedbackForm']=form 
     data_dict['pagetitle']=context.description 
     data_dict['coursecode']=course.course_code 
     data_dict['feedbacktitle']="Content Feedback for "+course.fullname 
     data_dict['Completeness'] = (answered/allquestions)*100 
     data_dict['error']=errortext 
    else: 
     return HttpResponse(printerror("Thanks! You've answered all the questions!<br><a href=\"/feedback/teachers/"+course.course_code+"\">Continue with the teaching feedback.</a>")) 
    req_context = RequestContext(request) 
    return render_to_response('view.html', data_dict, req_context) 

답변

1

간단한 답 : 단지 즉, 그것은 사용해야 하나의 AnswerForm에 사용하고 어떤 종류의 필드로 관리 할 수 ​​있도록하고 위젯 : 보조 노트로

class AnswerForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(AnswerForm, self).__init__(*args, **kwargs) 
     instance = self.instance 
     if instance.question.question_type == 'MCQ': 
      self.fields["statement"] = forms.ChoiceField(
       choices=instance.get_choices(), 
       widget=forms.RadioSelect(attrs={'class': 'allradio',}) 
       ) 
     else: 
      self.fields["statement"] = forms.CharField(
       widget=forms.Textarea() 
       ) 
     self.fields['statement'].label = instance.get_label() 

    class Meta: 
     model = Answer 
     exclude=('question','person','course','teacher','questionaire') 

, 모델의 속성 값을 모델의 생성자에 전달할 수 있습니다.

answer = Answer(
     question=Question.objects.get(id=request.session['question']), 
     person=student, 
     course=course, 
     questionnaire=questionnaire, 
     # User.objects.get(id=request.user.pk) will return request.user 
     # so it's just useless - just use request.user 
     tathya_user=request.user 
     ) 
+0

감사합니다. 내 문제는 거의 해결되었습니다. 다른 지점에 갇혀 있지만 DIY 방식에 더 충실하십시오. – biztiger