Запрос в шаблоне Django
Я пытаюсь сделать запрос внутри шаблона django, но я просто не уверен, как правильно сформулировать запрос, у меня есть две модели 1-category 2-items и я пытаюсь получить все товары определенной категории по ее ID {% for item in Category.objects.get(id=${this.id}).items.all%}{{item.name}}{%endfor%}
вот полный шаблон:
<div class="inventory-content">
<div class='category'>
<div>Categories</div>
<div class='category-checkbox'>
{%for category in items%}
<input type="checkbox" id="{{category.id}}" name="{{category.name}}" value="{{category.id}}">
<label for="{{category.name}}"> {{category.name}}</label><br>
{%endfor%}
</div>
</div>
<div class='items'></div>
</div>
<script>
$('.category-checkbox input[type="checkbox"]').on('click', function() {
if ($(this).is(':checked')) {
// Add the element to the div with an id identifier
$('.items').append(`<div id="item_${this.id}">{% for item in Category.objects.get(id=${this.id}).items.all%}{{item.name}}{%endfor%}</div>`);
} else {
// Remove the element from the div targeted by the id identifier
$(`#item_${this.id}`).remove();
}
});
</script>
models.py:
class Category(models.Model):
name = models.CharField(max_length=150)
vessel = models.ForeignKey(Vessel,on_delete=models.CASCADE,related_name='category')
def __str__(self):
return self.name
class Item(models.Model):
name = models.CharField(max_length=255)
part_number = models.IntegerField(blank=True)
ROB = models.IntegerField(default=0)
category=models.ForeignKey(Category,related_name='items',on_delete=models.CASCADE)
def __str__(self):
return self.name
views.py:
def index(request,pk):
vessel_id = Vessel.objects.get(id=pk)
categories = vessel_id.category.all()
category = Category.objects.all()
item = categories.prefetch_related(
'items')
context ={"vessel_id":vessel_id,'items':item,"category":category}
return render(request,'inventory.html',context)
Также мне сказали, что это плохая практика писать запрос внутри шаблона, так что если вы можете подсказать мне, каким лучшим способом я мог бы достичь этого? Это запрос на все товары в определенной категории, когда они отмечены
В шаблонах Django нельзя вызывать методы с аргументами, поэтому вы никак не сможете написать запрос внутри шаблона.
Единственно правильный способ - делать запрос внутри представления и затем передавать ResultSet в контекст внутри render() функции.
В качестве vessel_id у вас Vessel объект, а не его id. Будьте осторожны с этим.
Вы обязательно должны получить то, что вам нужно в вашем views. Вы уже знаете, как передавать и использовать context. Даже для scripts, но это может быть немного сложнее. Вы можете попробовать:
script_insider = ''.join([item.name for item in Category.objects.get(id=id_you_want).items.all()])
Суммируйте ваши Items имена к этому: 'name_1name_2name_3'. Вы можете использовать ' ' вместо '', тогда пробелы будут разделять имена: 'имя_1 имя_2 имя_3'.
В шаблонах вы не можете свободно использовать код. В основном вы будете использовать for циклы и if условия. Вы также можете прочитать о Custom Tags, которые иногда могут быть более точными с шаблонными значениями.