Django - 显示用户个人资料中的购买列表 - 包含模板和其他应用程序中的列表

问题描述:

我正在使用Django执行项目,并使用PayPal订阅。当您购买产品时,会将详细信息保存在“采购”表中(顺便说一句,它会在数据库中写入购买3次,但这是另一个问题)。 现在我试图在用户的配置文件模板中显示购买列表。我有一个包含列表的购买模板,当我通过自己的URL查看它时,它会起作用,但每当我尝试在其他模板中显示时,它都只是空白。Django - 显示用户个人资料中的购买列表 - 包含模板和其他应用程序中的列表

这是我的结构:

  • 应用:客户,产品,贝宝
  • 模式:用户(自定义),产品,购买
  • 模板:简介,产品,采购,paypal_return /取消, ...
  • 浏览次数:注册,登录,注销,ALL_PRODUCTS,paypal_return /取消,...
  • templatetags/products_extra:paypal_form_for,而现在一台带purchases_list simple_tag(我也尝试只是一个观点我ñ产品/ views.py)

而且我的问题是:

  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" %} 
+0

purchases.html和profile.html继承自哪些模板? –

+0

配置文件继承自base.html(主要是网站的页眉和页脚),购买不从任何继承。我尝试过从配置文件继承并创建{%block%},但无法使其工作 – Ire

+0

您能向我们展示用于绘制配置文件页面的视图代码吗?你必须在那里设置购买变量和你想要呈现的内容。我不认为自定义模板标签在这种情况下是很好的解决方案。 –

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

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

当您在另一个模板中包含模板时,您必须认为它只是一个复制/粘贴操作。为了正确渲染,你必须提供合适的上下文变量,在这种情况下,purchases

此外,我相信你可能想通过只显示当前登录用户的购买进一步改善你的看法。

编辑:

如果你想使用的模板标签来做到这一点,你可以看看inclusion tags。它们对您的使用情况来说似乎很完美

我想不出一种使用模板继承的方法。继承更适合于定义一个固定的页眉和页脚。

+0

这工作,并使总的意义。我能以这种方式传递多个上下文变量吗?例如我还想在配置文件页面中显示该用户的支持案例。 return request(request,'account/profile.html',{'purchases':purchases,'cases':cases}' 只是出于好奇,有没有其他的方式来做到这一点(simple_tags,temp inheritance,... )或只有包含标记? 关于您的添加,当然,我当时只是试图理解逻辑,所以我简化了它:) 谢谢! – Ire

+0

您可以根据需要传递尽可能多的变量。你的例子是完全有效的。关于您的其他问题,请查看上面编辑的答案。 –

+0

谢谢,这很完美! 还有一件事。如果我只想显示一个项目,例如最后的购买和我定义视图/包含标签为: '高清spss_last_purchase(请求): last_purchase = Purchase.objects.last() 打印 “HOLA” 回报{ 'last_purchase':last_purchase}' 我如何显示在模板中,如果我没有for循环,因为它是单个项目? 再次感谢! – Ire

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

{% block purchasess %}{% endblock %} 
+0

是的,对不起,那是从我尝试模板继承的时候开始的。我只是删除它们,但仍然没有显示任何配置文件模板 – Ire