Я пытаюсь получить данные в своих моделях «Машины», а затем мне нужно получить дополнительную информацию из другой таблицы, связанной с каждой машиной. Я пробую приведенный ниже код в views.py и отображаю его на указанной html-странице.
def allmachinesLOGO(request):
machines=Machine.objects.all()
c = ""
for m in machines:
if m.tb_order_set.filter(status = "2").exists():
c = "2"
else:
c = "0"
context = {'machines':machines,'condition':c}
return render(request,'pline/machineslogos.html',context)
{% if condition == "2" %}
<h4> working</h4>
<img class = "btn-circle" style = "width: 15px" src = "{% static 'images/icons/icons8-green-circle-48.png' %}" alt = "image" />
{% else %}
<h4>stop</h4>
{{ condition }}
<img class = "btn-circle" style = "width: 15px" src = "{% static 'images/icons/icons8-red-circle-48.png' %}" alt = "image" />
{% endif %}
Как правильно передать цикл из views.py в шаблон в Django
Привет, я просто хочу показать, работает ли машина или не работает по статусу, указанному в другой таблице. если статус = 2, то работает, если нет, то показывает, что не работает
В терминале, когда я печатаю условие, он работает нормально, но когда я перемещаю html, чтобы проверить, равен ли он "2" или нет, всегда пишется 0
Какова ценность этой строки m.tb_order_set.filter(status = "2").exists() ?
Его помещают в цикл for для каждой записи в таблице, если оператор проверяет, существует ли строка со статусом = 2 или нет, основываясь на том, что она написана как истинная или ложная. поэтому, если это правда, то c равно 2, а если не c = 0
Можешь поделиться models
@ashkan попробуйте напечатать на каждой итерации цикла «c», у вас, скорее всего, последний c = 0, поэтому 0.
@ashkan добавил опцию фильтрации одной строкой: Machine.objects.filter(tb_order__status='2'). Также обновлен код шаблона.
В представлении на каждой итерации цикла я создаю словарь с двумя значениями: «машины», «статус» и помещаю его в список ааа.
Либо удалите строку в представлении (если вы не хотите, чтобы отображались строки со статусом '0'):
else:
aaa.append({'machines': m, 'status': '0'})
Тогда строка с 'машинами': м, 'статус': '0' не будет записываться.
Возможно есть способ без цикла фильтровать по вторичной модели. Было бы интересно посмотреть, есть ли такой способ.
Просмотры.py
def allmachinesLOGO(request):
machines = Machine.objects.all()
aaa = []
for m in machines:
if m.tb_order_set.filter(status='2').exists():
aaa.append({'machines': m, 'status': '2'})
else:
aaa.append({'machines': m, 'status': '0'})
context = {'context': aaa}
return render(request, 'pline/machineslogos.html', context)
Шаблоны
{% for m in context %}
{% if m.status == '2' %}
<h4> working</h4>
<p>{{ 'machines' }} : {{ m.machines }} {{ 'status' }} : {{ m.status }} </p>
{% else %}
<h4>stop</h4>
<p>{{ 'machines' }} : {{ m.machines }} {{ 'status' }} : {{ m.status }} </p>
{% endif %}
{% endfor %}
Еще один способ. Отфильтровать машину по вторичной модели со статусом = '2'. Чтобы убедиться, что это так, два цикла (внешний перебирает Machine, а внутренний a.tb_order_set.all() и выводит статус в print(stat.status)):
bbb = Machine.objects.filter(tb_order__status='2')#If unique records are needed, then add distinct().
print(bbb)
for a in bbb:
for stat in a.tb_order_set.all():
print(stat.status)
Что именно вы хотите отобразить в шаблоне