我有这两个模型,Invoice
代表发票,Item
代表发票上的项目。
from django.db import models
# Create your models here.
class Invoice(models.Model):
vendor = models.CharField(max_length=200)
client = models.CharField(max_length=200)
number = models.CharField(max_length=200)
date = models.DateTimeField(max_length=200)
due_date = models.DateTimeField()
def __str__(self):
return "Invoice number: {}".format(self.number)
class Item(models.Model):
invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE)
description = models.TextField()
quantity = models.DecimalField(max_digits=19, decimal_places=2)
rate = models.DecimalField(max_digits=19, decimal_places=2)
amount = models.DecimalField(max_digits=19, decimal_places=2)
subtotal = models.DecimalField(max_digits=19, decimal_places=2)
tax = models.DecimalField(max_digits=19, decimal_places=2)
notes = models.TextField()
terms = models.TextField()
def __str__(self):
return "{}".format(self.description)
这些是收集信息的形式:
from django import forms
from .models import Invoice, Item
class InvoiceForm(forms.ModelForm):
class Meta:
model = Invoice
fields = ('vendor','client', 'number', 'date', 'due_date')
widgets = {
'date': forms.TextInput(attrs={'class':'datepicker'}),
'due_date': forms.TextInput(attrs={'class':'datepicker'}),
}
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ('description', 'quantity', 'rate', 'amount',
'subtotal', 'tax', 'notes', 'terms')
我的问题是如何引用模板中的任何字段ItemForm
以便捕获数据?
因为至少InvoiceForm
我对它没有任何问题,它向我展示了。例如,如果我这样做,我没有问题:
<!-- Client -->
<div class="row">
<div class="input-field col s4">
<label for="{{ form.client.id_for_label }}">Client</label>
{{ form.client }}
</div>
<div class="input-field col s4 offset-s4">
<label for="{{ form.due_date.id_for_label }}">Due Date</label>
{{ form.due_date }}
</div>
</div>
但是当尝试引用某些字段时,ItemForm
我不知道应该如何完成。例如,如果我想在模板中显示字段description
,ItemForm
我应该怎么做?因为如果我尝试这样的事情,它不会向我显示任何东西:
<div class="input-field col s5">
{{ form.description }}
</div>
这是我的观点,虽然我也不知道如何连接这两种形式,但现在我只对它们至少在模板中正确显示感兴趣:
def invoice_generator(request):
form = InvoiceForm
return render(request, 'invoiceapp/invoice_generator.html', {'form': form})
也许我注意力不集中或者我变得复杂,但我真的不知道如何继续。
我感谢您的帮助。
通常,当您处理这些类型的关系(
Autor/Libro
、Factura/Item
等)时,您应该使用Formsets
它们帮助您在同一视图中处理多个表单。在这种情况下,您可以使用
InlineFormset
:在您的模板中
invoice_generator.html
:一些考虑:
form
del参数inlineformset_factory
是可选的,我使用它是因为您已经定义了表单。extra
的参数inlineformset_factory
用于指示items
您最初将拥有的金额,即您的发票将显示为 4 种形式Item
。FormSets
并手动呈现表单时,您必须定义management_form
({{ formset.management_form }}
)FormSets
并手动呈现表单时,您必须指明id
它才能正常工作 ({{ form.id }}
)我使用基于类的视图来做到这一点:
每个模型的不同形式,并覆盖
get_context_data
类方法: