Django, создайте новое значение внешнего ключа (выпадающий список) перед сохранением - PullRequest
0 голосов
/ 16 марта 2019

Я новичок в 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})

1 Ответ

0 голосов
/ 16 марта 2019

Мое предложение состоит в том, чтобы сначала сохранить журнал, а затем сохранить строки журнала с параметром journal_number, установленным для этого журнала.Вы увидите, что будет выглядеть примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...