【问题标题】:Django - Having trouble using foreign key modelDjango - 使用外键模型时遇到问题
【发布时间】:2019-04-26 00:05:06
【问题描述】:

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

【问题讨论】:

  • An Invoice has ONE and ONLY ONE Customer. 那么你应该使用OneToOneField
  • @SachinKukreja 是的,谢谢,我是 Django 新手,你可以告诉我。

标签: python sql django web-applications


【解决方案1】:

Django 中的外键是多对一键。如果您的发票只有一位您使用的客户,则应使用 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()})

【讨论】:

    【解决方案2】:

    你可以这样做:

    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

    【讨论】:

    • 不使用基于类的视图,只是我在文档中遇到的第一个视图哈!你的其他东西有效,但我同意@Vivek Signh 的回答,因为他说的是 OneToOneField。
    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 2019-03-26
    • 2011-08-14
    • 2014-02-01
    • 2015-08-11
    • 2019-11-04
    • 2023-01-02
    相关资源
    最近更新 更多