TL; DR访问对象外键,发票必须有一个客户,如何在HTML模板中显示发票及其客户数据?
我正在开发一个发票系统,所以我有这些模型。
class Customer(models.Model):
name = models.CharField(max_length=100, default='')
email = models.EmailField(max_length=100, default='')
phone_num = models.CharField(max_length=10, default='')
address = models.CharField(max_length=200, default='')
def __str__(self):
return str(self.id)
class Invoice(models.Model):
amount = models.FloatField(max_length=10, default=0)
job_description = models.CharField(max_length=100, default="")
date_of_issue = models.DateField(default='')
customer = models.ForeignKey(Customer, on_delete=models.PROTECT,
related_name='cus')
def __str__(self):
return str(self.job_description + "\t$" + str(self.amount))
发票只有一个客户。
我可以使用模板轻松地分别打印客户和发票。如何访问发送发票的客户?
如果要查找发票,如何获得客户名称和联系方式以显示在模板中?
当前,我已经显示了所有发票(循环浏览),并希望显示带有发票信息的客户名称和ID号。
然后我该如何向后进行搜索并搜索属于客户'x'的所有发票?
答案 0 :(得分:1)
您可以这样做:
for inv in Invoice.objects.all():
print(inv.custom.name)
print(inv.custom.email)
在模板中:
{% for inv in invoices %}
{{ inv.customer.name }}
{% endfor %}
您需要通过类似以下的上下文发送此信息:
return render(request, 'template.html', { 'invoices': Invoice.objects.all() })
您需要将查询集从“视图”发送到“模板”。您可以使用render来做到这一点。
如果您使用的是基于类的视图,请尝试如下操作:
class SomeListView(ListView):
model = Invoice
template = 'your_template.html'
# template for list view
{% for inv in object_list %}
{{ inv.customer.name }}
{% endfor %}
有关ListView
的更多详细信息,请参见此处答案 1 :(得分:1)
Django中的ForeignKey是多对一键。如果您使用的发票只有一位客户,则应改用OneToOneKey。但是无论如何您都可以访问它。
for invoice in Invoice.objects.all():
invoice.customer # to get the model
invoice.customer.name # to get the name field of Customer model
在模板中
{% for invoice in invoices %}
{{ invoice.customer.name }}
{% endfor %}
请求
return render(request, 'template_name.html',context={'invoices':Invoice.objects.all()})