如何在引导选项卡块中按 django 模板中的多对多字段过滤对象
Posted
技术标签:
【中文标题】如何在引导选项卡块中按 django 模板中的多对多字段过滤对象【英文标题】:How to filter objects by many to many field in django templates in block of bootstrap tabs 【发布时间】:2014-05-20 18:27:48 【问题描述】:我的模型如下所示:
class Category(MPTTModel):
class MPTTMeta:
order_insertion_by = ['category_title']
category_title = models.CharField(max_length=100, verbose_name='Название категории', blank=False)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
category_slug = models.CharField(max_length=100, verbose_name='URL')
category_image = models.ImageField(upload_to=make_upload_path, default="", verbose_name='Изображение')
def __unicode__(self):
return self.category_title
class Product(models.Model):
product_title = models.CharField(max_length=100, verbose_name='Название товара', blank=False)
product_category = models.ManyToManyField(Category, blank=False, related_name='cat')
所以我有带有引导选项卡的模板
% block tabs %
<ul class="nav nav-tabs">
% for cat in categories %
<li><a href="# cat.category_slug " data-toggle="tab"> cat.category_title </a></li>
% endfor %
</ul>
<div class="tab-content">
% for cat in categories %
<div class="tab-pane" id=" cat.category_slug ">
% for prod in products %
% if prod.product_category == cat.category_title %
<p><img src='http://127.0.0.1:8000/ prod.product_image ' ></p>
% endif %
% endfor %
</div>
% endfor %
</div>
% endblock %
我的想法是为每个类别显示选项卡,并在一个选项卡中显示 product_category 中具有此类类别的产品(多对多)。
第一部分效果很好......在一个简单的测试中,django 为类别创建选项卡并在每个选项卡中显示正确的 category_image....
<ul class="nav nav-tabs">
% for cat in categories %
<li><a href="# cat.category_slug " data-toggle="tab"> cat.category_title </a></li>
% endfor %
</ul>
<div class="tab-content">
% for cat in categories %
<div class="tab-pane" id=" cat.category_slug ">
<p><img src='http://127.0.0.1:8000/ cat.category_image ' ></p>
</div>
% endfor %
</div>
但我无法处理在该选项卡中显示产品(product_title 等)。
如何在选项卡中过滤和显示产品???
第二个问题不在这个主题:) - 如何避免在 img src 中硬编码主机地址??
更新: 为什么这样的代码不起作用
<div class="tab-content">
% for cat in categories %
<div class="tab-pane" id=" cat.category_slug ">
% for prod in products%
% for cat in prod.categories.all %
% if prod.product_category == cat.category_title %
prod.product_title
% endif %
% endfor %
% endfor %
</div>
% endfor %
</div>
在 view.py 中
def products(request): # передает в файл tabs.html все объекты Product в переменную products
return render_to_response('tabs.html', 'products': Product.objects.all(),
'username': auth.get_user(request).username,
'categories': Category.objects.all())
【问题讨论】:
【参考方案1】:我就是这样解决的!!!
<div class="tab-content">
% for cat in categories %
<div class="tab-pane" id=" cat.category_slug ">
% for prod in products %
% for categ in prod.product_category.all %
% ifequal categ cat %
prod.product_title
% endifequal %
% endfor %
% endfor %
</div>
% endfor %
</div>
【讨论】:
以上是关于如何在引导选项卡块中按 django 模板中的多对多字段过滤对象的主要内容,如果未能解决你的问题,请参考以下文章
CASCADE 究竟如何与 Django 中的多对多字段一起工作
Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?