如何在引导选项卡块中按 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 模板中的多对多字段过滤对象的主要内容,如果未能解决你的问题,请参考以下文章

模板中的多对多通过模型中的 Django 访问条目

如何在 django 中处理未保存的多对多关系?

CASCADE 究竟如何与 Django 中的多对多字段一起工作

Django,在 self 类中的多对多关系中,我如何在 ORM 方面相互引用?

如何过滤和访问 Django QuerySet 中的多对多字段?

如何从 django 模板访问多对多“通过”表的属性?