Как отобразить связанный объект, заданный в django?
Я знаю, что на этот вопрос, кажется, просто ответить, и что ответ будет где-то в ссылке на API, но я немного новичок в django и пролистал API в течение нескольких дней, пытаясь это сделать. Любая помощь будет высоко оценен!
Я создаю базовое приложение для блогов для компьютерных лабораторий моего университета, и в этом приложении у вас есть две соответствующие страницы. Страница местоположений, которая отображает информацию о каждой лаборатории в кампусе (часы, местоположение / здание) и страницу ресурсов, которая отображает информацию об оборудовании в каждой лаборатории.
Мой файл 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>
Смысл отображения этого в том, что у университета есть строгие рекомендации по представлению информации на веб-страницах, и они хотят, чтобы все было в аккуратных упорядоченных таблицах. Таблица должна иметь динамический диапазон строк в первом столбце, чтобы люди могли добавлять или удалять типы компьютеров / принтеров через администратора django.
Я искал в Stackru и обнаружил несколько проблем, похожих на мою, и они сказали, что для получения связанных объектов в одном пакетном запросе используется prefetch_related, однако когда я сделал это, я начал получать TypeError "RelatedManager" не повторяется при попытке доступа принтеры в шаблоне. Я понимаю, почему это происходит. Это связано с тем, что класс RelatedManager, обрабатывающий запрос, не возвращает список / массив / кортеж. Я просто не знаю, как, черт возьми, я могу получить доступ к нужной мне информации так, как мне нужно.
Я частично работал с закомментированным общим видом, однако при использованииlocation.lab_printers.count
Значения возвращались непоследовательными и не отражали фактические объекты в базе данных, что приводило к неправильному форматированию и приводило к отсутствию элементов td и неточному отображению.
Извините, если я болтаю, это просто сложная проблема, и у меня совершенно нет идей, как мне поступить.
Любая помощь будет очень признательна. Спасибо за ваше время!