Вывод "Следуя отношениям "назад"" в шаблон
В начале этой недели я начал работать с Django, посмотрел несколько руководств и решил попробовать перевести сайт, который я сделал на PHP, на что-то более современное. В выходные я столкнулся с некоторыми проблемами и смог получить помощь по некоторым из них, но одна проблема осталась.
У меня уже есть существующая база данных с некоторой информацией, которую я хочу извлечь для отображения на сайте. Информация изменяется через базу данных, поэтому Django не нужно иметь дело ни с чем из этого - просто отображение результатов в загружаемом файле шаблона.
По сути, Django будет иметь 2 модели - по одной для каждой соответствующей таблицы базы данных.
Первая модель относится к продукции
class Bikes(models.Model):
bikempn = models.CharField(primary_key=True, max_length=50)
bikecategory = models.CharField(max_length=50)
bikeyear = models.CharField(max_length=4)
bikebrand = models.CharField(max_length=50)
bikedesc = models.CharField(max_length=255)
bikesize = models.CharField(max_length=50)
bikecolour = models.CharField(max_length=255)
bikeurl = models.CharField(max_length=255)
class Meta:
managed = False
db_table = 'bikes'
Вторая модель связана с датами их ожидаемого прибытия. Эта модель будет представлять собой представление базы данных, которое выполняет некоторую логику, сравнивая товар, который находится в пути, с количеством соответствующих товаров, которые находятся в резерве.
Модель:
class Eta(models.Model):
bikempn = models.ForeignKey(Bikes, on_delete=models.CASCADE, primary_key = True, db_column='bikempn', related_name='etas')
eta = models.DateField()
class Meta:
managed = False
db_table = 'bike_eta'
Идея этого сайта заключается в том, чтобы дать людям знать, будет ли интересующий их продукт доставлен в ближайшее время.
Я пытался придумать запрос, который отобразит всю связанную информацию, но все, что я нашел в Интернете, не сработало. Я получил некоторую помощь на этом пути, но снова уперся в стену и, честно говоря, чувствую себя глупо, если еще не разобрался в этом.
Итак, в настоящее время у меня есть запрос следующего содержания:
kidsquery = Bikes.objects.filter(bikecategory='kids').select_related('etas')
Это отфильтровывает только велосипеды, отнесенные к категории детских, и должно объединить две модели вместе.
Мой соответствующий шаблон для отображения этой информации следующий:
{% extends 'base.html' %}
{% block content %}
{% if kidsquery %}
<div class="table-responsive">
<table class="table table-striped table-hover table-bordered table-sm">
<thead class="table-dark">
<tr>
<th scope="col">Year</th>
<th scope="col">Brand</th>
<th scope="col">Model</th>
<th scope="col">Colour</th>
<th scope="col">Size</th>
<th scope="col">Part#</th>
<th scope="col">ETA</th>
</tr>
</thead>
{% for info in kidsquery %}
<tr>
<td>{{ info.bikeyear }}</td>
<td>{{ info.bikebrand }}</td>
{% if info.bikeurl %}
<td><a href="{{ info.bikeurl }}" target="_blank">{{ info.bikedesc }}</a></td>
{% else %}
<td>{{ info.bikedesc }}</td>
{% endif %}
<td>{{ info.bikecolour }}</td>
<td>{{ info.bikesize }}</td>
<td>{{ info.bikempn }}</td>
{% for arrival in info.etas.all %}
{% if arrival is null %}
<td>Contact Us</td>
{% else %}
<td>{{ arrival|date:"F Y" }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
{% endif %}
{% endblock %}
Кто-нибудь знает, почему я не могу добиться отображения чего-либо в последнем столбце (где должны отображаться значения дат eta (или, в противном случае, результат "Contact Us")?
Правильное решение для вытаскивания информации в шаблоне:
{% extends 'base.html' %}
{% block content %}
{% if kidsquery %}
<div class="table-responsive">
<table class="table table-striped table-hover table-bordered table-sm">
<thead class="table-dark">
<tr>
<th scope="col">Year</th>
<th scope="col">Brand</th>
<th scope="col">Model</th>
<th scope="col">Colour</th>
<th scope="col">Size</th>
<th scope="col">Part#</th>
<th scope="col">ETA</th>
</tr>
</thead>
{% for info in kidsquery %}
<tr>
<td>{{ info.bikeyear }}</td>
<td>{{ info.bikebrand }}</td>
{% if info.bikeurl %}
<td><a href="{{ info.bikeurl }}" target="_blank">{{ info.bikedesc }}</a></td>
{% else %}
<td>{{ info.bikedesc }}</td>
{% endif %}
<td>{{ info.bikecolour }}</td>
<td>{{ info.bikesize }}</td>
<td>{{ info.bikempn }}</td>
{% for arrival in info.etas.all %}
{% if arrival.eta %}
<td>{{ arrival.eta|date:"F Y" }} </td>
{% else %}
<td>Contact Us</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
{% endif %}
{% endblock %}
Поменял местами чеки и компенсировал отсутствие даты.