0

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

这是有问题的模型:

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

假设我有一个列表 ,lessonsList并且CompositeLesson能够成功地遍历该列表。其他字段(即实际日期)正确显示。

模板代码片段:

{% 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})
4

2 回答 2

2

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

你应该替换x.lessonID = le.idx.lesson = le

如果这不起作用,还可以尝试 a x.save()before a lessonsList.append(x)

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

于 2012-06-07T18:47:00.080 回答
0

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

长短,lesson.lesson在您的模板上下文中是未定义的,所以当然任何类似的东西lesson.lesson.id也是未定义的。老实说,我不确定如何纠正这个问题,因为你的代码是一团糟。我的建议是回到绘图板上,如果您需要帮助找出完成您想要实现的目标的最佳方法,请提出一个新问题。我不相信你所拥有的东西是可行的,即使你让它工作,它也是 Django ORM 的一个混蛋,你最好让任何一个可怜的开发人员在未来继承你的代码库想要谋杀你用生锈的耙子。

于 2012-06-07T17:49:17.147 回答