Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 跨父窗体和窗体集验证窗体_Django_Django Forms - Fatal编程技术网

Django 跨父窗体和窗体集验证窗体

Django 跨父窗体和窗体集验证窗体,django,django-forms,Django,Django Forms,我在这里使用示例代码来说明问题,因此请原谅任何错误,不要陷入架构中。其目的是允许用户将分期付款输入我的费用管理应用程序。想象一下,你去超市,用信用卡花20英镑买了一些食物,花15英镑买了一条牛仔裤。这将作为35英镑的付款分为两类:食品和服装 我的项目使用复式簿记,因此系统将此记录为一个单一条目,包含三个子行项目:信用卡分类账中的35英镑,服装分类账中的20英镑,食品分类账中的15英镑 我的问题是: 1.如何跨父表单和表单集进行验证,以确保在父表单中输入的金额等于在表单集中输入的金额之和? 2.在

我在这里使用示例代码来说明问题,因此请原谅任何错误,不要陷入架构中。其目的是允许用户将分期付款输入我的费用管理应用程序。想象一下,你去超市,用信用卡花20英镑买了一些食物,花15英镑买了一条牛仔裤。这将作为35英镑的付款分为两类:食品和服装

我的项目使用复式簿记,因此系统将此记录为一个单一条目,包含三个子行项目:信用卡分类账中的35英镑,服装分类账中的20英镑,食品分类账中的15英镑

我的问题是: 1.如何跨父表单和表单集进行验证,以确保在父表单中输入的金额等于在表单集中输入的金额之和? 2.在创建新条目时,是否应该在视图中使用formset_factory()或inlineformset_factory()?当创建编辑视图时

models.py:

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')