2012-06-07 4 views
0

템플릿의 관련 필드 ID를 템플릿에 표시하려면 약 1 시간 반 동안 노력했습니다. 공상적인 게 없어요. 전 신분증 만 갖고 싶습니다. Django 템플릿에 표시 할 키를 가져올 수 없습니다.

class CompositeLesson(models.Model): 
    lesson = models.ForeignKey(Lesson) 
    student = models.ForeignKey(Student) 
    actualDate = models.DateTimeField() 

내가 CompositeLesson 목록, lessonsList을 가지고 성공적으로 목록을 반복 할 수 있어요 가정 : 여기

문제의 모델입니다. 다른 입력란 (예 : actualDate)이 올바르게 표시됩니다. 스 니펫 템플릿 코드의

:

{% for lesson in lessonsList %} 
<tr{% if forloop.counter|divisibleby:"2" %} class="shaded_row"{% endif %}> 
    <td>{{ lesson.actualDate }}</td> 
    <td class="table_button"> 
    {% if not lesson.isCancelled %} 
     <div class="table_button_div" id="cancel_{{ lesson__lesson__id }}"><a href="#">Cancel Lesson</a></div> 
    {% else %} 
     <div class="cancelled_lesson"></div> 
    {% endif %} 

문제는 내가 목록에있는 학습 객체의 ID를 얻을 수있다. 나는 시도했다 :

lesson.lesson 
lesson.lesson.id 
lesson.lesson__id 
lesson__lesson__id 
lesson.lesson.get_id 

... 그리고 아무도 작동하지 않는다.

미리 감사드립니다.

편집 : 내가 옳았다 표시,

def all_student_lessons(request, id): 
    # This should list all lessons up to today plus the next four, and call out any cancelled or unpaid lessons 
    # User should have the option to mark lessons as paid or cancel them 
    s = Student.objects.get(pk = id) 
    if s.teacher != request.user: 
     return HttpResponseForbidden() 

    less = Lesson.objects.filter(student = id) 
    lessonsList = [] 
    for le in less: 
     if le.frequency == 0: 
      # lesson occurs only once 
      x = CompositeLesson() 
      x.lessonID = le.id 
      x.studentID = id 
      x.actualDate = datetime.combine(le.startDate, le.lessonTime) 
      x.isCancelled = False 
      try: 
       c = CancelledLesson.objects.get(lesson = le.id, cancelledLessonDate = le.startDate) 
       x.canLesson = c.id 
       x.isCancelled = True 
      except: 
       x.canLesson = None 
      try: 
       p = PaidLesson.objects.get(lesson = le.id, actualDate = le.startDate) 
       x.payLesson = p.id 
      except: 
       x.payLesson = None 
      lessonsList.append(x) 
     else: 
      sd = next_date(le.startDate, le.frequency, le.startDate) 
      while sd <= date.today(): 
       x = CompositeLesson() 
       x.lessonID = le.id 
       x.studentID = id 
       x.actualDate = datetime.combine(sd, le.lessonTime) 
       x.isCancelled = False 
       try: 
        c = CancelledLesson.objects.get(lesson = le.id, cancelledLessonDate = le.startDate) 
        x.canLesson = c.id 
        x.isCancelled = True 
       except: 
        x.canLesson = None 
       try: 
        p = PaidLesson.objects.get(lesson = le.id, actualDate = le.startDate) 
        x.payLesson = p.id 
       except: 
        x.payLesson = None 
       lessonsList.append(x) 
       sd += timedelta(le.frequency) 
    lessonsList.sort(key = lambda x: x.actualDate) 
    return render_to_response('manage_lessons.html', {'lessonsList': lessonsList, 
                's': s}) 
+0

'lesson.lesson.pk'을 사용해 보셨나요? –

+0

'lesson.lesson.pk'을 불행히도 시도하지 않은 것들의 목록에 추가하십시오 ... –

+0

어떻게 레슨 목록을보기에 만드시겠습니까? 'select_related ('lesson')'을 필터에 추가 해보십시오. –

답변

2

보기에서 결코 x.lesson을 할당하지 않습니다. 논리적 인 경우 lesson.lesson은 정의되지 않습니다.

당신은 문제가 해결되지 않으면, 또한 lessonsList.append(x) 전에 x.save()을 시도 x.lesson = le

에 대한 x.lessonID = le.id를 교체해야합니다.

모델에 정의되지 않은 새 속성을 추가하기 때문에 모델이 너무 잘 정의되어 있지 않습니다. 또한, CompositeLesson 오브젝트가 표시되는보기 전에 작성 및 저장하는 것을 고려할 수도 있습니다. 스케줄링, 지불 또는 취소 된 수업과 같이 다른 중요한 이벤트가 발생할 때마다 이러한 객체를 생성하거나 수정할 수 있습니다.

+1

그게 효과가! 여분의 눈 세트를 가져 주셔서 감사합니다. –

0

그리고 여기 요청에 따라, 교훈을 구축 내이다. 문제는 당신이 여기에있는 쿼리 세트를 다루지 않고 설정 한 커스텀 데이터 구조를 다루는 것입니다. CompositeLesson을 인스턴스화하는 것만 데이터베이스에 저장하지 않습니다. 따라서 실제로 데이터베이스 레코드와 상관 관계가없는 인스턴스화 된 CompositeLesson 모델의 목록이 있지만 데이터베이스에에 이 속하는 경우 lesson FK와 같은 값을 확인할 수 있습니다.

길이가 짧고 lesson.lesson은 템플릿 컨텍스트에서 정의되지 않으므로 물론 lesson.lesson.id 같은 것도 정의되지 않습니다. 나는 솔직히이 문제를 해결하는 방법을 잘 모르겠다. 왜냐하면 코드가 지나치게 엉망진창이기 때문이다. 내 제안은 드로잉 보드로 돌아가는 것이고, 달성하려는 목표를 달성하는 최선의 방법을 찾는 데 도움이 필요하면 새로운 질문을 엽니 다. 나는 당신이 가지고있는 것이 실행 가능하다고 믿지 않으며, 심지어 작동 시키더라도 Django ORM을 그렇게 나쁜 방향으로 만들었습니다. 앞으로 당신의 코드베이스를 상속받는 가난한 개발자가 당신을 죽이려고 할 때 최선을 다할 것입니다. 녹슨 갈퀴.

+0

재미있는 이유는 쉘에서 lesson.lesson.id에 액세스 할 수 있기 때문입니다. 그것은 혼란스러운 부분입니다. 새로운 질문을 열고 다음 댓글에 링크를 달아서 내가 성취하고자하는 것에 대해 더 많은 맥락을 갖도록하겠습니다. –

관련 문제