Django-使用外键模型有麻烦

时间:2018-11-23 11:12:34

标签: python sql django web-applications

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'的所有发票?

2 个答案:

答案 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()})