Django - 在用户个人资料中显示购买列表 - 包含来自另一个应用程序的列表模板

Django - Show list of purchases in user's profile - include template with list from another app

我正在用 Django 做一个项目,我正在使用 PayPal 订阅。当您购买产品时,它会将详细信息保存在 Purchases table 中(顺便说一句,它在数据库中写入了 3 次购买,但这是另一个问题)。 现在我试图在用户的个人资料模板中显示购买列表。我有一个带有列表的购买模板,当我通过它自己的 URL 看到它时它可以工作,但每当我试图在其他模板中显示它时它只是空白。

这是我的结构:

我的问题是:

  1. 我应该使用不同的应用程序进行购买吗?

  2. 构建购买列表并将其显示在另一个应用程序的模板中的最佳方式是什么?我已经阅读了大量的帖子和文档,并尝试只包含模板 {% include.. %},使用 simple_tags,使用模板继承,包含标签......但我无法让它工作。

下面是我现在的代码。

提前致谢!

models.py

class Purchase (models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='purchases')
    product = models.ForeignKey(Product)
    license_end = models.DateTimeField(default=timezone.now)

templatetags/product_extras.py

@register.simple_tag
def purchases_list(request):
    purchases = Purchase.objects.all()
    return render(request, 'products/purchases.html', {'purchases': purchases})

urls.py

    url(r'^purchases/$', product_extras.purchases_list, name='purchases'),

purchases.html

    <p>PURCHASES</p>
        {% for purchase in purchases %}
            <p>{{purchase.id}}-{{ purchase.product }} - {{ purchase.license_end }}</p>
        {% endfor %}

profile.html

    {% include "products/purchases.html" %}

在您的 purchases.html 中删除模板标签:

{% block purchasess %}{% endblock %}

根据您的信息,我解决您问题的方法是将您的个人资料视图更改为:

def profile(request):
    purchases = Purchases.objects.all()
    return render(request, 'account/profile.html', {'purchases':purchases})

当您在另一个模板中包含一个模板时,您必须认为这只是一个 copy/paste 操作。为了使其正确呈现,您必须提供适当的上下文变量,在本例中为 purchases.

此外,我相信您可能希望通过仅显示当前登录用户的购买来进一步改善您的观点。

编辑:

如果你想使用模板标签来做,你可以看看inclusion tags。它们似乎非常适合您的用例。

我想不出使用模板继承来做到这一点的方法。继承更适合定义固定的页眉和页脚。