【问题标题】:Django, create the new value of foreign key (drop list) before saveDjango,在保存之前创建外键(下拉列表)的新值
【发布时间】:2019-03-15 21:46:26
【问题描述】:

我是 django 新手,我想做一个简单的会计应用程序,但我面临以下问题: 我有 3 个模型;帐户、日记帐和 journalLine, 我希望每个期刊号可以有多行。例如,期刊号 1 可以有 4 行等。 所以在提交之前,我希望自动创建新的期刊号,并将值分配给外键字段 (jounralNumber),而不是显示列表(该列表仅显示在数据库上创建的期刊号)

models.py

from django.db import models
from django import forms

# Create your models here.
# Model For chart of accounts table
class accounts(models.Model):
accNumber = models.AutoField(primary_key=True,unique=True)
accName  = models.CharField(max_length=200,unique=True)
accNumberMin = models.PositiveIntegerField(default=0,unique=True)
accNumberMax = models.PositiveIntegerField(default=0,unique=True)
#-- to definde values for choices main or sub-account-start
main = 'main'
sub = 'sub'
main_sub_choices = ((main, 'Main account'),(sub, 'Sub account'))
#-- to definde values for choices for main or sub-account-end
main_sub = 
models.CharField(max_length=10,choices=main_sub_choices,default='sub')

def __str__(self): ## to show accounts as names not objects in Admen panel
    return self.accName



class journal(models.Model):
journalNumber = models.PositiveIntegerField(default='',unique=True)
journalDate = models.DateField()
journalDesc = models.CharField(max_length=300)

def __str__(self):
    return str(self.journalNumber)



class journalLine(models.Model):
LineNumber = models.AutoField(primary_key=True)
journalNumber = models.ForeignKey(journal,on_delete=models.CASCADE)
accNumber = 
models.ForeignKey('accounts',on_delete=models.CASCADE,blank=False)
debit = models.PositiveIntegerField(default=0)
credit = models.PositiveIntegerField(default=0)

def __str__(self):
    return str(self.LineNumber)

views.py

def postpage(request):
initial = {'journalNumber': journal.objects.all().count() + 1,}
lineformset = modelformset_factory(journalLine,exclude=(),extra=1)
if request.method == 'POST':
    form = journalForm(request.POST)
    lineform = lineformset(request.POST)
    if lineform.is_valid():
        lineform.save()
        form.save()
        return HttpResponseRedirect('/myacc/thanks/')
else:
    form = journalForm(initial=initial)
    lineform = lineformset(queryset=journalLine.objects.all().none())

return render(request,'myacc/post.html',{'form':form, 'lineform':lineform})

【问题讨论】:

  • 为什么不排除该字段,让您的后端为您处理?
  • 它不会起作用,因为即使该字段被排除在外,它应该用一个值填充,并且所有行都应该分配给至少一个期刊号
  • 那么不是所有的期刊行都分配给同一个期刊吗?
  • 不,每个日记帐行应该至少有 2 行,并且可以更多,在会计日记帐分录中是日期、描述、受影响的帐户以及借方或贷方金额
  • 也许我没有正确表达我的问题。当您输入日记帐行时,您是为某个日记帐编号输入它们,还是每行都与不同的日记帐编号相关?

标签: python django forms django-models


【解决方案1】:

我的建议是先保存日记,然后将日记编号设置为该日记的日记行保存。您的视图将看起来像这样,

def postpage(request):
    initial = {'journalNumber': journal.objects.all().count() + 1,}
    lineformset = modelformset_factory(journalLine,exclude=(),extra=1)
    if request.method == 'POST':
        form = journalForm(request.POST)
        if form.is_valid():
            journal = form.save()
            lineform = lineformset(request.POST)
            if lineform.is_valid():
                lineform.save(commit=False)
                lineform.journal_number = journal # or journal.pk
                lineform.save()
                return HttpResponseRedirect('/myacc/thanks/')
    else:
        form = journalForm(initial=initial)
        lineform = lineformset(queryset=journalLine.objects.all().none())

    return render(request,'myacc/post.html',{'form':form, 'lineform':lineform})

希望这会有所帮助!

编辑:这样你必须排除你的 journal_number 字段。如果您想保留期刊编号字段,那么您的表单需要分为 2 个步骤,一个用于创建期刊,另一个用于创建 journal_line。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多