Django模型过滤器没有拉入对象

时间:2012-10-24 12:18:15

标签: django django-models django-views

我在Ubuntu 12.04上使用Django 1.4和Python 2.7。

我有一个模板,应该显示每个产品的产品和产品功能列表,并且由于某些原因,这些功能不会显示在模板中。

以下是观点:

@login_required
def view_products(request):
    """
    ..  function:: view_products()

        View the Products

        :param request: Django Request object
    """

    data = { 'user' : request.user }
    if (request.user.is_authenticated() and request.user.is_superuser):
        products = Products.objects.all()

        add_feature_form = rsb.forms.AddProductFeatureForm();
        data.update({ 'form' : add_feature_form })
        data.update({ 'products' : products })
        data.update(csrf(request))

        return render_to_response("view_products.html", data)

    return render_to_response("index.html", data)

以下是使用产品功能的模板部分:

<table>
    {% for product in products %}
        <tr>
            <td align="right">Product Name:</td><td>{{ product.name }}</td>
        </tr>
        <tr>
            <td align="right">Price:<br /></td><td>${{ product.price }}</td>
        </tr>
        <tr>
            <ul>
            {% for productfeature in product.productfeature_set.all %}
                <form action="/removeProductFeature/" method="post">{% csrf_token %}
                <li>
                    {{ productfeature.feature }}
                    <input type="hidden" name="feature" value={{ productfeature.feature }}>
                    <input type="hidden" name="product_id" value={{ product.id }}>
                    <label class="formlabel">&nbsp;</label><input type="submit" value="Remove  &#9658;">
                </tr>
                </form>
            {% endfor %}
            </ul>
        </tr>
        <tr>
            <form action="/addProductFeature/" method="post">{% csrf_token %}
            <table>
                <tr>
                    <td align="right"><label class="formlabel">Add Feature:<br /></label></td><td>{{ form.feature }}</td>
                </tr>
                <input type="hidden" name="product_id" value={{ product.id }}>
                <tr>
                    <td align="right"><label class="formlabel">&nbsp;</label></td><td><input type="submit" value="Add  &#9658;"></td>
                </tr>
            </form>
            </table>
        </tr>
   {% endfor %}
</table>

这个模板基本上应该向您展示一个产品。每个功能都将在其下方列出,并选择“删除”该功能。然后,在底部,一个允许您添加其他功能的字段。

现有功能根本没有显示。关于我可能做错什么的任何建议?

更新1:

我错过了模板中的sproduct.productfeatures_set.all不是product.productfeature_set.all。我很高兴。谢谢大家!

2 个答案:

答案 0 :(得分:3)

请不要这样做:

product_features = []
for product in products:
    features = ProductFeatures.objects.filter(product = product)
    product_features.append(features)
    product.features = product_features

相反,只需将您的products变量传递给模板上下文。

在模板中执行:

{% for product in products %}
    Product id: {{ product.pk }}
    {% for productfeature in product.productfeature_set.all %}
        {{ productfeature.feature }}
    {% endfor %}
{% endfor %}

你会问productfeature_set是什么(或者,我希望你会问:D),这是一个非常好的问题。不要惊慌,全是documented

现在,这将导致子查询产生。解决方案是使用prefetch_related。但是你想的那一刻我不必担心:)

答案 1 :(得分:1)

是的,你正在尝试实现已经构建到Django中的东西!

你应该使用django的反向关系构建。

# give an Product instance product
# this should work
product.productfeature_set.all()

可从模板product.productfeature_set.all访问 并且可以删除。