社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

显示发票的所有项目-django

paniklas • 3 年前 • 1653 次点击  

我想获得属于发票的所有项目,并将其显示给模板,但没有成功。到目前为止,我所做的工作如下:

我有两种型号:

class Invoice(models.Model):

    PAYMENT_OPTIONS = (
        ('CASH', _('CASH')),
        ('DEPOSIT', _('DEPOSIT')),
        ('CARD', _('CARD')),
    )

    INVOICE_TYPE = (
        ('Service', _('Service')),
    )

    invoice_number = models.CharField(max_length=7, unique=True, default='INV4898')
    invoice_user = models.ForeignKey(Account, on_delete=models.CASCADE)
    invoice_type = models.CharField(max_length=30, choices=INVOICE_TYPE, default='Service')
    payment_option = models.CharField(max_length=30, choices=PAYMENT_OPTIONS)
    invoice_name = models.CharField(max_length=30, null=True, blank=True)
    vat = models.CharField(max_length=9, blank=True, null=True)
    gross_amount = models.DecimalField(max_digits=6, decimal_places=2)
    vat_amount = models.DecimalField(max_digits=6, decimal_places=2)
    net_amount = models.DecimalField(max_digits=6, decimal_places=2)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
      return f"{self.invoice_user.first_name} {self.invoice_user.last_name} - {self.invoice_number}"

class Item(models.Model):

    invoice = models.ForeignKey(Invoice, related_name='items', on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    quantity = models.IntegerField(default=1)
    unit_price = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    net_amount = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    vat_rate = models.CharField(max_length=10, default=0)
    discount = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    is_paid = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
      return f"{self.invoice.invoice_number}"

在视图中。py我有一个类似的列表视图,其中我试图根据发票号获取所有发票的列表,然后将每个发票号与项目中的发票进行匹配。但是,使用以下代码,第一次打印会显示所有发票号,第二次打印会显示所有发票的所有项目,而不是每张发票的项目。

def list_invoices(request, userprofile_id):
    user_profile = get_object_or_404(Account, pk=userprofile_id)
    all_invoices =Invoice.objects.filter(invoice_user=user_profile)

    invoice_number = Invoice.objects.values_list('invoice_number')
    print(invoice_number)
    
    item_invoice = Item.objects.filter(invoice__invoice_number__in=invoice_number)
    print(item_invoice)


    context = {
        'all_invoices': all_invoices,
        'user_profile': user_profile,
        'item_invoice': item_invoice,
    }
    return render(request, 'invoices/list-invoices.html', context)

我将非常感谢您的帮助。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129071
 
1653 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    3 年前

你不需要去拿 Item 这不是 invoice_number 关于 Invoice .你只需要把发票交给 user_profile ,也可以预取 项目 s:

def list_invoices(request, userprofile_id):
    user_profile = get_object_or_404(Account, pk=userprofile_id)
    all_invoices = Invoice.objects.filter(
        invoice_user=user_profile
    ).prefetch_related('items')

    context = {
        'all_invoices': all_invoices,
        'user_profile': user_profile
    }
    return render(request, 'invoices/list-invoices.html', context)

然后在模板中,您可以访问 .items ,所以:

<ul>
{% for invoice in all_invoices %}
    <li> {{ invoice.invoice_number }}</li>
    <ul>
    {% for item in invoice.items.all %}
        <li>{{ item.quantity }} {{ item.title }}</li>
    {% endfor %}
    </ul>
{% endfor %}
</ul>