无法获取Django模板中显示的密钥

时间:2012-06-07 16:19:33

标签: django django-templates

我已经尝试了大约一天半的时间来获取模型中相关字段的ID以显示在我的模板中。没什么好看的,我只想要身份证。

以下是有问题的模型:

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

假设我有lessonsList的列表CompositeLesson,并且能够成功遍历列表。其他字段(即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 %}

问题是我无法获取列表中Lesson对象的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})

2 个答案:

答案 0 :(得分:2)

在您看来,您永远不会分配x.lesson。这是合乎逻辑的,lesson.lesson未定义。

您应该将x.lessonID = le.id替换为x.lesson = le

如果不起作用,请在x.save()之前尝试lessonsList.append(x)

在旁注中,您的模型似乎没有太明确定义,因为您正在为其添加未在模型中定义的新属性。此外,您可以考虑在显示它们的视图之前创建和存储CompositeLesson对象。您可能希望在发生其他重要事件时创建或修改这些对象,例如正在安排,支付或取消的课程。

答案 1 :(得分:0)

而且,看来我是对的。问题在于,您不是在处理查询集,而是在设置自定义数据结构。简单地实例化CompositeLesson不会将其保存到数据库中。所以你拥有的是一个实例化的CompositeLesson模型列表,它与实际的数据库记录无关,但是依赖在数据库上确定像你的lesson FK这样的值。

长而短,lesson.lesson在模板上下文中未定义,因此当然lesson.lesson.id之类的内容也未定义。我真的不确定如何纠正这个问题,因为你的代码是一个彻头彻尾的混乱。我的建议是回到绘图板,如果你需要帮助找出实现你想要实现的目标的最佳方法,请打开一个新问题。我不相信你的东西是可行的,即使你让它工作,它是Django ORM的这种混蛋,你最好让任何可怜的开发人员继承你的代码库,以后谋杀你生锈的耙子。