我已经尝试了大约一天半的时间来获取模型中相关字段的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})
答案 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的这种混蛋,你最好让任何可怜的开发人员继承你的代码库,以后谋杀你生锈的耙子。