如何在 Django 中显示相关对象集?
How do I display a related object set in django?
我知道这个问题似乎很容易回答,答案会在 API ref 的某个地方,但我对 django 有点陌生,并且已经通过 API 倾注了几天试图完成这项工作。任何帮助将不胜感激!
我正在为我大学的计算机实验室创建一个基本的博客应用程序,在这个应用程序中有两个相关页面。位置页面显示校园内每个实验室的信息(小时数,location/building),资源页面显示每个实验室的设备信息。
我的 models.py 文件如图所示设置(还有其他模型,但这些是唯一相关的模型:
class Location(models.Model):
name = models.CharField(max_length=100)
computer = models.ForeignKey('Computer')
printer = models.ForeignKey('Printer')
class Computer(models.Model):
computer_location = models.ForeignKey('Location', related_name='lab_computers')
computer_model = models.ForeignKey('HardwareModel')
class Printer(models.Model):
printer_location = models.ForeignKey('Location', related_name='lab_printers')
printer_model = models.ForeignKey('HardwareModel')
class HardwareModel(models.Model):
brand = models.CharField(max_length = 100)
model_num = models.CharField(max_length = 30)
我的 views.py 文件:
class LocationsView(generic.ListView): #This isn't the view to be concerned with
template_name = 'blog/location_list.html'
context_object_name = 'locations'
queryset = Location.objects.all()
#This is commented out because i was trying to modify the view to allow extra context
#I'm aware that you can't have 2 views with the same name. Just assume only one is active
#class ResourcesView(generic.ListView):
# context_object_name = 'locations'
# queryset = Location.objects.all()
def ResourcesView(request):
locations = Location.objects.prefetch_related('lab_printers').all()
return render_to_response('blog/resource_list.html',
{'locations': locations})
我需要显示的模板是这样的:
<table>
<tr>
<th>Lab</th>
<th>Device</th>
<th>Type</th>
<th>Model</th>
</tr>
{% for location in locations %}
<tr>
<td rowspan="{{ location.lab_printers.count }}">{{ location.name }}</td>
<td>Computer</td>
<td>{{ location.computer.computer_model.brand }}</td>
<td>{{ location.computer.computer_model.model_num }}</td>
</tr>
<tr>
<td>Printer</td>
<td>{{ location.printer.printer_model.brand }}</td>
<td>{{ location.printer.printer_model.model_num }}</td>
</tr>
{% endfor %}
</table>
这样显示的目的是大学对如何在网页上显示信息有严格的指导方针,他们希望所有内容都井井有条 tables。 table 需要在第一列上有一个动态的 rowspan 以支持人们通过 django admin 添加或删除 computer/printer 类型。
我搜索了 Whosebug 并发现了一些与我类似的问题,他们说使用 prefetch_related 在一个批查询中获取相关对象,但是当我这样做时我开始得到一个 TypeError "RelatedManager" 在尝试访问模板中的打印机时不是可迭代的。我明白为什么会这样。这是因为处理查询的 RelatedManager class 没有 return list/array/tuple。我只是不知道我到底如何才能以我需要的方式访问我需要的信息。
我确实让它部分地与注释掉的通用视图一起工作,但是当我使用
location.lab_printers.count
返回的值不一致,没有反映数据库中的实际对象,弄乱了格式,导致缺少 td 元素和显示不准确。
对不起,如果我胡说八道,这只是一个复杂的问题,我完全运行不知道我应该如何去做。
我们将不胜感激任何帮助。感谢您的宝贵时间!
我知道这个问题似乎很容易回答,答案会在 API ref 的某个地方,但我对 django 有点陌生,并且已经通过 API 倾注了几天试图完成这项工作。任何帮助将不胜感激!
我正在为我大学的计算机实验室创建一个基本的博客应用程序,在这个应用程序中有两个相关页面。位置页面显示校园内每个实验室的信息(小时数,location/building),资源页面显示每个实验室的设备信息。
我的 models.py 文件如图所示设置(还有其他模型,但这些是唯一相关的模型:
class Location(models.Model):
name = models.CharField(max_length=100)
computer = models.ForeignKey('Computer')
printer = models.ForeignKey('Printer')
class Computer(models.Model):
computer_location = models.ForeignKey('Location', related_name='lab_computers')
computer_model = models.ForeignKey('HardwareModel')
class Printer(models.Model):
printer_location = models.ForeignKey('Location', related_name='lab_printers')
printer_model = models.ForeignKey('HardwareModel')
class HardwareModel(models.Model):
brand = models.CharField(max_length = 100)
model_num = models.CharField(max_length = 30)
我的 views.py 文件:
class LocationsView(generic.ListView): #This isn't the view to be concerned with
template_name = 'blog/location_list.html'
context_object_name = 'locations'
queryset = Location.objects.all()
#This is commented out because i was trying to modify the view to allow extra context
#I'm aware that you can't have 2 views with the same name. Just assume only one is active
#class ResourcesView(generic.ListView):
# context_object_name = 'locations'
# queryset = Location.objects.all()
def ResourcesView(request):
locations = Location.objects.prefetch_related('lab_printers').all()
return render_to_response('blog/resource_list.html',
{'locations': locations})
我需要显示的模板是这样的:
<table>
<tr>
<th>Lab</th>
<th>Device</th>
<th>Type</th>
<th>Model</th>
</tr>
{% for location in locations %}
<tr>
<td rowspan="{{ location.lab_printers.count }}">{{ location.name }}</td>
<td>Computer</td>
<td>{{ location.computer.computer_model.brand }}</td>
<td>{{ location.computer.computer_model.model_num }}</td>
</tr>
<tr>
<td>Printer</td>
<td>{{ location.printer.printer_model.brand }}</td>
<td>{{ location.printer.printer_model.model_num }}</td>
</tr>
{% endfor %}
</table>
这样显示的目的是大学对如何在网页上显示信息有严格的指导方针,他们希望所有内容都井井有条 tables。 table 需要在第一列上有一个动态的 rowspan 以支持人们通过 django admin 添加或删除 computer/printer 类型。
我搜索了 Whosebug 并发现了一些与我类似的问题,他们说使用 prefetch_related 在一个批查询中获取相关对象,但是当我这样做时我开始得到一个 TypeError "RelatedManager" 在尝试访问模板中的打印机时不是可迭代的。我明白为什么会这样。这是因为处理查询的 RelatedManager class 没有 return list/array/tuple。我只是不知道我到底如何才能以我需要的方式访问我需要的信息。
我确实让它部分地与注释掉的通用视图一起工作,但是当我使用
location.lab_printers.count
返回的值不一致,没有反映数据库中的实际对象,弄乱了格式,导致缺少 td 元素和显示不准确。
对不起,如果我胡说八道,这只是一个复杂的问题,我完全运行不知道我应该如何去做。
我们将不胜感激任何帮助。感谢您的宝贵时间!