【问题标题】:Using reverse relations in django class based views在基于 Django 类的视图中使用反向关系
【发布时间】:2015-03-02 19:59:49
【问题描述】:

我有一个 django 模型如下:

class Category(models.Model):
    category_name = models.CharField(max_length=250, blank=True, null=True)

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"

    def __unicode__(self):
        return self.category_name

class Product(models.Model):
    category = models.ForeignKey(Category)
    model_name = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        verbose_name = "Product"
        verbose_name_plural = "Products"

    def __unicode__(self):
        return self.model_name

在我看来,我有一个 ListView 如下:

class CategoryList(ListView):
    model = Category
    template_name = 'categories.html'

而我的categories.html如下:

{% extends "base.html" %}

{% block content %}
    <div>
        <h2>Categories</h2>

        {% for category in object_list %}
        <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
            <div class="panel panel-default">
                <div class="panel-heading" role="tab" id="h{{category.id}}">
                    <h4 class="panel-title">
                        <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#{{category.id}}" aria-expanded="true" aria-controls="{{category.id}}">
                          {{category.category_name}}
                        </a>
                    </h4>
                </div>
                <div id="{{category.id}}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="h{{category.id}}">
                    <div class="panel-body">
                        {{category.category_name}} //trying to change here by displaying all model_names!!
                    </div>
                </div>
            </div>
        </div>
        {% endfor %}
{% endblock %}

现在我正在尝试在模板(即面板正文中)的手风琴内显示一个类别中所有可用产品的列表。如何更改视图以访问这些反向关系?对基于类的视图还很陌生?

【问题讨论】:

    标签: django twitter-bootstrap django-views django-class-based-views


    【解决方案1】:

    您可以使用相关领域经理products_set访问每个类别的相关产品,例如:

    {{category.category_name}} //trying to change here by displaying all model_names!!
    <ul>
    {% for product in category.product_set.all %}
      <li>{{ product.model_name }}</li>
    {% endfor %}
    </ul>
    

    如果您需要更复杂的过滤,您可以在视图中执行此操作或编写自定义模板标记。在视图中执行它看起来像这样:

    class CategoryList(ListView):
        model = Category
        template_name = 'categories.html'
    
        def get_queryset(self):
            qs = super(CategoryList, self).get_queryset()
            for category in qs:
                category.some_filtered_products = category.product_set.filter(...)
            return qs
    

    这将在查看期间解析查询集,并将过滤后的产品放入每个 Category 实例上的新内存属性中。

    【讨论】:

    • 哇!!不知道我们可以直接在模板中使用它!谢谢
    • 是的 - 您不能将参数传递给模板中的方法,但任何可以不使用参数进行评估的东西都可以正常工作。有关详细信息,请参见此处的“幕后”框:docs.djangoproject.com/en/1.7/topics/templates/#variables
    猜你喜欢
    • 2012-01-25
    • 2017-11-03
    • 2018-09-13
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多