Django 跨父窗体和窗体集验证窗体
我在这里使用示例代码来说明问题,因此请原谅任何错误,不要陷入架构中。其目的是允许用户将分期付款输入我的费用管理应用程序。想象一下,你去超市,用信用卡花20英镑买了一些食物,花15英镑买了一条牛仔裤。这将作为35英镑的付款分为两类:食品和服装 我的项目使用复式簿记,因此系统将此记录为一个单一条目,包含三个子行项目:信用卡分类账中的35英镑,服装分类账中的20英镑,食品分类账中的15英镑 我的问题是: 1.如何跨父表单和表单集进行验证,以确保在父表单中输入的金额等于在表单集中输入的金额之和? 2.在创建新条目时,是否应该在视图中使用formset_factory()或inlineformset_factory()?当创建编辑视图时 models.py:Django 跨父窗体和窗体集验证窗体,django,django-forms,Django,Django Forms,我在这里使用示例代码来说明问题,因此请原谅任何错误,不要陷入架构中。其目的是允许用户将分期付款输入我的费用管理应用程序。想象一下,你去超市,用信用卡花20英镑买了一些食物,花15英镑买了一条牛仔裤。这将作为35英镑的付款分为两类:食品和服装 我的项目使用复式簿记,因此系统将此记录为一个单一条目,包含三个子行项目:信用卡分类账中的35英镑,服装分类账中的20英镑,食品分类账中的15英镑 我的问题是: 1.如何跨父表单和表单集进行验证,以确保在父表单中输入的金额等于在表单集中输入的金额之和? 2.在
class Ledger(models.Model):
name = models.CharField(max_length=255)
LEDGER_TYPE_CHOICES = (
('AC', 'Account'),
('EX', 'Expense'),
)
type = models.CharField(
max_length=2,
choices=ENRTY_TYPE_CHOICES,
blank=False,
null=False,
default='0'
)
class Entry(models.Model):
date = models.DateField(null=False, blank=False)
ENTRY_TYPE_CHOICES = (
('BP', 'Bank Payment'),
('BR', 'Bank Receipt'),
('TR', 'Transfer'),
('SP', 'Split Payment'),
)
type = models.CharField(
max_length=2,
choices=ENRTY_TYPE_CHOICES,
blank=False,
null=False,
default='0'
)
description = models.CharField(max_length=255, null=True, blank=True)
class LineItem(models.Model):
entry = models.ForeignKey(JournalEntry, on_delete=models.CASCADE)
ledger = models.ForeignKey(Ledger, on_delete=models.PROTECT)
description = models.CharField(max_length=255, null=True, blank=True)
amount = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
Forms.py
class SplitPaymentForm(forms.Form):
date = forms.DateField(widget=DateTypeInput())
account = ModelChoiceField(queryset=Ledger.objects.filter(type='AC'))
store = forms.CharField(required=True)
amount = forms.DecimalField(decimal_places=2)
class SplitPaymentLineItemForm(ModelForm):
ledger = ModelChoiceField(queryset=Ledger.objects.filter(type='EX'))
project = forms.ModelChoiceField(queryset=Project.objects.filter(status=0), empty_label="Project", required=False)
amount = forms.DecimalField(decimal_places=2)
Views.py
def split_payments_new(request):
LineItemFormSet = inlineformset_factory(Entry, LineItem, form=SplitPaymentLineItemForm, extra=2)
if request.method == 'POST':
form = SplitPaymentForm(request.POST)
lineitem_formset = LineItemFormSet(request.POST)
if form.is_valid() and lineitem_formset.is_valid():
# Some business logic will go here. Haven't done it yet...
messages.success(request, "Split Payment successfully created.")
#return HttpResponseRedirect(reverse('journal:split_payments_show_all'))
else:
form = SplitPaymentForm(initial = {'date': datetime.date.today().strftime('%Y-%m-%d')})
lineitem_formset = LineItemFormSet()
return render(request, 'journal/split_payments_new.html')