在 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 的内容,有时可以使用模板值更精确。
我正在尝试在 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 的内容,有时可以使用模板值更精确。