【发布时间】: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的代码,我想你那里有一些非标准的东西。