Запрос в шаблоне 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, которые иногда могут быть более точными с шаблонными значениями.

Вернуться на верх