2015-02-02 2 views
0

Возможно, я не вижу лес из-за всех деревьев, но у меня очень странная проблема.Подкатегории Django не отображаются в шаблоне

views.py:

from django.shortcuts import render 
from models import Question, QuestionAnswerAlloc, Section 

def home(request): 
    sections = Section.objects.all() 
    for s in sections: 
     questions = Question.objects.filter(section=s) 
     for q in questions: 
      answersalloc = QuestionAnswerAlloc.objects.filter(question=q) 
      q.answers.append(answersalloc) 
     s.questions.append(questions) 

    return render(request, "questionaire/index.html", {'sections': sections}) 

models.py:

from django.db import models 

from portal.models import Customer 


class Section(models.Model): 
    title = models.CharField(max_length=150) 
    weight = models.FloatField() 
    maxscore = models.FloatField() 

    questions = [] 

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


class Question(models.Model): 
    title = models.TextField() 
    section = models.ForeignKey(Section) 
    weight = models.FloatField() 

    answers = [] 

    def __unicode__(self): 
     return self.title 


class Answer(models.Model): 
    title = models.CharField(max_length=150) 
    points = models.IntegerField(default=0, help_text="This has to be a value between 0 and 5") 
    is_weighted = models.BooleanField(default=True, help_text="If this answer does not apply (N/a) it is not weighted!") 

    def __unicode__(self): 
     return self.title 


class QuestionAnswerAlloc(models.Model): 
    question = models.ForeignKey(Question) 
    answer = models.ForeignKey(Answer) 

    def __unicode__(self): 
     return "Possible Answer" 


class Report(models.Model): 
    STATUS_STARTED = "started" 
    STATUS_FIN = "finished" 
    STATUS_INPROG = "inprogress" 
    STATUS_ABORT = "aborted" 

    date = models.DateField(auto_now_add=True, blank=True) 
    title = models.CharField(max_length=150) 
    started_time = models.DateTimeField() 
    end_time = models.DateTimeField() 
    status = models.CharField(max_length=150, default=STATUS_STARTED) 
    guid = models.CharField(max_length=150, unique=True) 

    def __unicode__(self): 
     return self.title 


class ReportAnswer(models.Model): 
    title = models.CharField(max_length=150) 

    orignal_answer = models.ForeignKey(Answer) 
    question = models.ForeignKey(Question) 
    section = models.ForeignKey(Section) 
    report = models.ForeignKey(Report) 

    points = models.FloatField() 
    weight = models.FloatField() 
    is_weighted = models.BooleanField(default=True) 

    customer = models.ForeignKey(Customer, blank=True, null=True) 

    def __unicode__(self): 
     return self.title 

И мой шаблон:

{% for s in sections %} 
      <div class="row"> 
       <div class="col-sm-12"> 
        <div class="FormStepInfo"> 
         <p class="QuestionaireSectionTitle">{{s.title}}</p> 
         <p class="QuestionaireSectionDesc"></p> 
        </div> 
       </div> 
      </div> 

       {% for q in s.questions %} 
       <div class="row"> 
        <hr/> 
        <div class="col-sm-2 quest-num">{{forloop.counter }}</div> 
        <div class="col-sm-10 quest-title"> 
         <label> 
          {{q.title}} 
         </label> 
         <br/> 

         <div class="CheckboxQuestion"> 
          {% for a in q.answers %} 
          <label for=""><input type="radio" name="Q3" value="{{a.points}}" id="q3a1">{{a.title}}</label> 
          {% endfor %} 
         </div> 
        </div> 
       </div> 
       {% endfor %} 
      {% endfor %} 

К сожалению, вопрос название не отображается, ни ответы. Если я распечатаю файл sys.stderr, я вижу, что есть вопросы, заданные в разделе. Я что-то упускаю? Я перезапустил свой «веб-сервер», поскольку я использую «python manage.py runningerver» примерно 10 раз и удалил свой кеш.

+0

Может быть, я ошибаюсь, но я думаю, что вы должны использовать 's.questions.extend (вопросы)' вместо 's.questions.append (вопросы)' – trnsnt

ответ

0

У вас довольно большое непонимание определений классов в Python. Обычно, когда вы определяете атрибут на уровне класса, он разделяется всеми членами класса. Поля Django используют специальную магию для обеспечения того, чтобы значения были для каждого экземпляра, а не для класса, но списки questions и answers этого не делают. Поэтому, даже если вы сможете заставить свой код работать, все ответы будут связаны со всеми вопросами.

К счастью, не нужно ничего делать. Django предоставляет вам обратные аксессоры, которые обеспечивают именно то, что вам нужно. Таким образом, точка зрения может быть упрощена просто:

def home(request): 
    sections = Section.objects.all() 
    return render(request, "questionaire/index.html", {'sections': sections}) 

и вид становится:

{% for s in sections %} 
    ... 
    {% for q in s.question_set.all %} 
     ... 
     {% for a in q.questionansweralloc_set.all %} 

     ...etc 
+0

Хорошо, это было смешно легко. Спасибо вам за это! – Richard

Смежные вопросы