【问题标题】:Can't get key to display in Django template无法获取在 Django 模板中显示的密钥
【发布时间】:2012-06-07 16:19:32
【问题描述】:

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

这是有问题的模型:

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

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

模板代码片段:

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

【问题讨论】:

  • 你试过lesson.lesson.pk吗?
  • lesson.lesson.pk 添加到我尝试过但不起作用的列表中,很遗憾...
  • 您是如何在视图中创建课程列表的?尝试将select_related('lesson') 添加到您的过滤器中。
  • @SindriGuðmundsson 我在视图中使用 list.append(x) - 我尝试在 shell 中运行它并且能够输出相关课程的 ID。 courseList 不是从 QuerySet 构建的,所以我认为添加 select_related 不会起作用。
  • 这里发生了其他事情。像lesson.lesson.id 这样的东西是完全有效的,应该返回课程的ID。即使没有select_related,它也应该发出一个新的查询来获得教训。请发布设置lessonList 的代码,我想你那里有一些非标准的东西。

标签: django django-templates


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 很有趣,因为我可以在 shell 中访问 c​​ourse.lesson.id。这是令人困惑的部分。我将打开一个新问题并将其链接到下一条评论中,以便您对我要完成的工作有更多的了解。
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 2012-05-15
    • 2021-04-21
    • 2013-10-14
    • 2016-06-28
    • 2023-03-31
    • 2013-10-31
    • 2019-06-18
    相关资源
    最近更新 更多