在 Django 模板中查询

Query in Django template

我正在尝试在 Django 模板中查询,但我不确定如何正确地表达查询,我有两个模型 1 类 2 项,我正在尝试获取特定的所有项目来自其 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'。您可以使用 ' ' 而不是 '',然后空格将分隔名称:'name_1 name_2 name_3'.

在模板中您不能随意使用代码。您将主要使用 for 循环和 if 条件。您还可以阅读有关 Custom Tags 的内容,有时可以使用模板值更精确。