2012-06-07 68 views
0

我一直在嘗試約一天半,以獲取模型中相關字段的ID以顯示在我的模板中。沒什麼奇特的,我只想要這個ID。無法獲取在Django模板中顯示的密鑰

這裏是有問題的模式:

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

假設我有一個列表,lessonsListCompositeLesson和我能夠成功地遍歷列表。其他字段(即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

您如何在視圖中創建lessonsList?嘗試添加一個'select_related('lesson')'到你的過濾器。 –

回答

2

在你看來,你永遠不會分配x.lesson。這是合乎邏輯的,lesson.lesson是未定義的。

,就應該替換爲x.lessonID = le.idx.lesson = le

如果不工作,也是一個lessonsList.append(x)之前嘗試的x.save()

在旁註中,您的模型似乎沒有被很好地定義,因爲您正在向模型中添加未定義的新屬性。另外,您可以考慮在顯示它們的視圖之前創建和存儲CompositeLesson對象。無論何時發生其他重要事件,例如正在安排,支付或取消的課程,您都可能想要創建或修改這些對象。

+1

工作正常!謝謝你的額外的眼睛。 –

0

而且,看來我是對的。問題在於你沒有在這裏處理查詢集,而是你設置的自定義數據結構。簡單實例化CompositeLesson不會將其保存到數據庫。因此,您擁有的是實例化的CompositeLesson型號的列表,它與實際的數據庫記錄沒有關聯,但其中的取決於數據庫上的以確定像lesson FK這樣的值。

長和短,lesson.lesson未在您的模板上下文中定義,因此當然也沒有定義任何類似lesson.lesson.id。我真的不太清楚如何糾正這個問題,因爲你的代碼是毫不猶豫的混亂。我的建議是回到繪圖板,如果您需要幫助來找出最佳方法來完成您想要實現的目標,請打開一個新問題。我不相信你所擁有的是可行的,即使你運行起來了,Django ORM也是如此的混亂,以至於你將最好的讓那些可憐的開發者繼承你的代碼庫,以期想要謀殺你用生鏽的耙子。

+0

有趣的是,我可以訪問shell中的lesson.lesson.id。這是令人困惑的部分。我會打開一個新的問題,並將其鏈接到下一個評論中,以便更多地瞭解我想要完成的內容。 –