I need help with saving data to django database.

26 views
Skip to first unread message

Viando Donwasta

unread,
Aug 16, 2022, 1:35:58 PM8/16/22
to Django users
Hi,
May I get help with this project? I am new to Django. Below is my view and model for your review.


class Invoice(models.Model):

    InvoiceNo = ShortUUIDField(length=16,
        prefix="GN_",
        alphabet="1234567890",
        primary_key=True,
        )
    InvoiceDate = models.DateField(default=datetime.now, blank=True)
    Account = models.CharField(max_length=50, blank=True)
    PaymentDueDate = models.DateField(default=datetime.now, blank=True)
    Location  = models.ForeignKey(Location, on_delete=models.DO_NOTHING, blank=True, default=1)
   # Product  = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
    Test = models.ManyToManyField("Products", blank=True, related_name="products")
    Address   = models.ForeignKey(Address, on_delete=models.DO_NOTHING)
    #Quantity = models.IntegerField(blank=True, default=1)
    Tax = models.IntegerField(default =0)
    SubTotal = models.DecimalField(blank=True, null=True,decimal_places=2,max_digits=10)
    Total = models.DecimalField(blank=True, null=True,decimal_places=2,max_digits=10)
    #Ful = models.FloatField(blank=True)

    def save(self, *args, **kwargs):
        #rate = Product.objects.get(pk=self.Product.id)
        test = Products.objects.all()
        total = 0
        for my in test:
            total +=  my.SubTotal
        self.SubTotal = total
        self.Total = self.SubTotal + self.Tax
        #self.Total = Sum(self.Total) + Sum( self.SubTotal)
        super(Invoice, self).save(*args, **kwargs)

    # @property
    # def PerformSub(self):
    #      myval = self.Quantity * self.Product.Price
    #      return myval

    # @property
    # def PerformCal(self):
    #     self.Total = self.SubTotal + self.Tax

    # def __str__(self):
    #     return self.InvoiceNo




class Products(models.Model):
    ProductDate = models.DateField(default=datetime.now, blank=True)
    Title = models.CharField(max_length=50, blank=True)
    Description = models.CharField(max_length=150, blank=True)
    Sku = models.CharField(max_length=50, blank=True)
    Price = models.FloatField(blank=True)
    Quantity = models.IntegerField(blank=True, default=1)
    SubTotal = models.DecimalField(blank=True, null=True,decimal_places=2,max_digits=10)
    SalesPrice = models.CharField(max_length=50, blank=True)


    def save(self, *args, **kwargs):
       # rate = Products.objects.get(pk=self.Product.id)
        self.SubTotal = self.Price * self.Quantity
        super(Products, self).save(*args, **kwargs)


    def __str__(self):
        return self.Title + "" + self.Description


class InvoiceForm(ModelForm):
    class Meta:
        model = Invoice
        fields = ['InvoiceNo', 'InvoiceDate', 'Account','PaymentDueDate', 'Location','Test', 'Address', 'Tax', 'SubTotal', 'Total'
        ]



Here is my view. Any help will be much appreciated thank you .





def dashboard(request):

    # forms = admin.get_form(invoices, res)
    location = Location.objects.all()
    address = Address.objects.all()
    products = Products.objects.all()
    form = InvoiceForm()
    # invoice = Invoice.objects.all()
    # invoice = get_object_or_404(Invoice)

    if request.method == 'POST':
        form = InvoiceForm(request.POST)
        if form.is_valid():
            # myinvoice = form.save(commit=False)

            print("test")

            invoiceTest = form.save(commit=True)



            invoice = Invoice()
            invoice.InvoiceNo = form.cleaned_data['InvoiceNo']
            invoice.InvoiceDate = form.cleaned_data['InvoiceDate']
            invoice.Account = form.cleaned_data['Account']
            invoice.PaymentDueDate = form.cleaned_data['PaymentDueDate']
            invoice.Location = form.cleaned_data['Location']
            invoice.Test =  form.cleaned_data['Test']
            invoice.Tax = form.cleaned_data['Tax']
            invoice.SubTotal = form.cleaned_data['SubTotal']
            invoice.Total = form.cleaned_data['Total']




            invoiceTest.save()
            # invoice.save_m2m()

            # print(invoiceForm)




            # invoice = Invoice(InvoiceNo=InvoiceNo,InvoiceDate=InvoiceDate,Account=Account,PaymentDueDate=PaymentDueDate,Location=mylocation,Tax=Tax,SubTotal=SubTotal,Total=Total)
            # invoice.save()


            return HttpResponseRedirect('index')


    else:
        form = InvoiceForm()
        # return redirect('dashboard')
    return render(request, 'pages/dashboard.html', { "form" :form , 'Location': location, 'Address': address, 'Products': products})

Paul Kudla (SCOM.CA Internet Services Inc.)

unread,
Aug 17, 2022, 9:02:51 AM8/17/22
to django...@googlegroups.com

ok i had a hudge problem when writing my invoice system

in general you need to over ride the save defination in the admin and
models.py files

this was never clearly documented in django.


I use inlines so the code gets really complicated really quickly

i have given my code you will need to muddle through it to do your own
thing.

my code was designed to run inlines, update an invoice number from
another form, do the math, taxes etc etc etc

it also interfaces to a customer database (kinda required for repeat
invoices)

i did everything in admin but you should look at the models override for
other stuff :

class InvoiceAdmin(admin.ModelAdmin):

class Invoice_Items_Inline(admin.TabularInline):
model = Invoice_Items
extra = 1

class Invoice_Payment_Inline(admin.TabularInline):
model = Invoice_Payment
extra = 1

formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':'40','style':
'height: 1em;'})},
models.TextField: {'widget': Textarea(attrs={'rows':1,
'cols':40,'style': 'height: 2em;'})},
}

def customer_name_sold_to(self, obj):
if (obj.sold_to):
return obj.sold_to.customer_name
return None
customer_name_sold_to.short_description = "Sold To"

def attention_sold_to(self, obj):
if (obj.sold_to):
return obj.sold_to.attention_to
return None
attention_sold_to.short_description = "Attention to"

def getinvoicebody(self, obj):


return None


def attention_ship_to(self, obj):
if (obj.ship_to):
return obj.ship_to.attention_to
return None
attention_ship_to.short_description = "Attention to"


def invoice_paid_total(self,obj) :
obj.paid_total = float(0.00)
try :
record = Invoice_Payment.objects.all().filter( payment_item = '%s'
%obj.invoice_number )
for nn in range (0,len(record)) : #start the update
paid_total = float(paid_total) + float(record[nn].cashbook_amount)

except : pass #No entries found against this invoice

return obj.paid_total

attention_ship_to.short_description = "Attention to"

def Print_Invoice(modeladmin, request, queryset) :
queryset.update(printed=True)

Print_Invoice.short_description = "Print Invoice(s)"


actions = [Print_Invoice]

#('attention_sold_to','attention_ship_to'),

fieldsets = [
('Info', {'fields':
[('invoice_number','invoice_date'),('sold_to','ship_to',),('purchase_order','terms','currency_type','delivery_type','foreign_account',)]}),
#,('sold_to_address',)
('#inline', {
'fields': (),
'description': 0
}),
('Details', {'fields':
[('sub_total'),('gst_tax_exempt','gst_tax_value','gst_tax_amount'),('hst_tax_exempt','hst_tax_value','hst_tax_amount'),('pst_tax_exempt','pst_tax_value','pst_tax_amount'),('invoice_total'),]}),
('#inline', {
'fields': (),
'description': 1
}),
('Status', {'fields':
[('ar_owing','printed','faxed','emailed','new_invoice'), ]}),
]


inlines = [Invoice_Items_Inline, Invoice_Payment_Inline, ]
reorder_inlines = True
list_display = ('invoice_number',
'invoice_date','customer_name_sold_to','body_search','sub_total','hst_tax_amount','invoice_total','invoice_paid_total','ar_owing')

search_fields = search_with_fk(['^invoice_number',
'body_search',
])


#readonly_fields = ('sold_to_address','ship_to_address')

date_hierarchy = 'invoice_date'
ordering = ('-invoice_date','-invoice_number_sort','ar_owing')

list_per_page = 100

index = True

adminextra_fields = [
('m21', 'sold_to', Contacts_Admin.list_display),
#('fkd', 'sold_to_address', ('sold_to',)),
('m21', 'ship_to', Contacts_Admin.list_display),
#('fkd', 'ship_to_address', ('ship_to',)),
]

def save_model(self, request, obj, form, change): #This will save create
#Check to see if this will be an invoice copy
copy = False
current_invoice = obj.invoice_number
if obj.new_invoice : #clear the flag and save the current object then
set new & date
obj.new_invoice = False
obj.save()
copy = True

obj.invoice_number = 'None' #Set for New invoice to be generated

import datetime
now = datetime.datetime.now()

obj.invoice_date = now.strftime("%Y-%m-%d")

#now duplicate body of invoice




if str(obj.invoice_number) == 'None' : #Assign An Invoice Number if needed
#Go get the next number
nextinvoice = Config_Data.objects.get(pk='INVOICE') #Go get the
current invoice number
next_invoice_num = int(nextinvoice.value) #Get the current invoice
number to be used next
next_invoice_num = next_invoice_num + 1
nextinvoice.value = str(next_invoice_num)
next_invoice_num = next_invoice_num - 1
nextinvoice.save() #Update the next invoice number to be used.

#Check to see if the invoice number is elsewhere in the system
#checkinvoice = Invoice.objects.get( pk='%s' %str(next_invoice_num) )

obj.invoice_number = str(next_invoice_num) #Set the invoice number to
the form.
obj.ar_owing = '9999999999'

#Set Search Index for Invoice Number
i1 = '0000000000'
obj.invoice_number_sort = i1[0:len(i1)-len(obj.invoice_number)] +
obj.invoice_number

obj.save() #Save the invoice

if copy :
for item in
Invoice.objects.get(pk=current_invoice).invoicing_items.all():
#Now do the copy
newitem = Invoice_Items( invoicing_item = obj,
item_date = item.item_date,
item = item.item ,
item_description = item.item_description,
item_qty = item.item_qty,
item_unit = item.item_unit,
item_extention = item.item_extention ,
)

newitem.save()





#def save_formset(self, request, form, formset, change):
# instances = formset.save(commit=False)
# f = open('/tmp/formset.text','w')
# f.write (str(len(instances)) + '\n')
#
# for instance in instances:
# f.write (str(instance) + '\n')
# instance.save()

# f.close()
#def save_formset(self, request, form, formset):
#for f in formset.forms:
# obj = f.instance
# obj.color = obj.color.upper() # or whatever change you'd like
# formset.save()

def save_related(self, request, form, formsets, change):
super(InvoiceAdmin, self).save_related(request, form, formsets, change)

invoice = form.instance

#Ok do the sub total
invoice.sub_total = float(0)
invoice.body_search = str(invoice.sold_to) + ' ' +
str(invoice.invoice_total) + ' '



for item in
Invoice.objects.get(pk=invoice.invoice_number).invoicing_items.all():
#set the search parameters for the this body line
if str(item.item) <> 'None' and str(item.item) <> '':
invoice.body_search = invoice.body_search + str(item.item) + ' '
if str(item.item_description) <> 'None' and
str(item.item_description) <> '' :
invoice.body_search = invoice.body_search +
str(item.item_description) + ' '

#Now do the math
if str(item.item_qty) <> 'None' and str(item.item_unit) <> 'None' :
item.item_extention = float(item.item_qty) * float(item.item_unit)
invoice.sub_total = float(invoice.sub_total) +
float(item.item_extention)
item.save()

#Now the taxes
if invoice.gst_tax_exempt == False :
invoice.gst_tax_amount = float(invoice.sub_total) *
float(invoice.gst_tax_value) / 100
else :
invoice.gst_tax_amount = float(0)

if invoice.hst_tax_exempt == False :
invoice.hst_tax_amount = float(invoice.sub_total) *
float(invoice.hst_tax_value) / 100
else :
invoice.hst_tax_amount = float(0)

if invoice.pst_tax_exempt == False :
invoice.pst_tax_amount = float(invoice.sub_total) *
float(invoice.pst_tax_value) / 100
else :
invoice.pst_tax_amount = float(0)

invoice.invoice_total = float(invoice.sub_total) +
float(invoice.gst_tax_amount) + float(invoice.hst_tax_amount) +
float(invoice.pst_tax_amount)

if invoice.ar_owing == '9999999999' :
invoice.ar_owing = invoice.invoice_total

#Now the a/r
total_ar = float(invoice.invoice_total)
try :
record = Invoice_Payment.objects.all().filter( payment_item = '%s'
%invoice.invoice_number )
for nn in range (0,len(record)) : #start the update
total_ar = total_ar - float(record[nn].cashbook_amount)
except : pass

invoice.ar_owing = total_ar #set the new ar value


invoice.save()

#Now generate the pdf's
if invoice.printed == True or invoice.faxed == True or invoice.emailed
== True :
makeinvoicepdf(invoice.invoice_number)



site.register(Invoice, InvoiceAdmin)


this is an example of my contacts save overrides in models.py:

def save(self, *args, **kwargs): #This will save / create the contact
entry
super(Contacts, self).save(*args, **kwargs) #Save the contact entry
self.accountid_text = '00000'
self.accountid_text =
self.accountid_text[0:5-len(str(self.accountid))] + str(self.accountid)

#See if i am going to email this contact ?
if not self.send_to == '' : #Send an email with contact info
send_subject = 'Contact Info for : %s - %s'
%(self.customer_name,self.send_to_subject)
send_from = 'in...@scom.ca'
send_files = []
send_to = self.send_to.split(',')
#Build the email text entry
send_text = '\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n' \

%(self.customer_name,self.attention_to,self.address_1,self.address_2,self.city,self.province,self.postal_code)

#for nn in range (0,len(self.phone_number) ):
# phone_data = self.phone_number[nn]

self.phonenumber = ''
for self.item in
Contacts.objects.get(pk=self.accountid).phone_number.all():
if str(self.item.phone_number) == '' or str(self.item.phone_number)
== 'None' or str(self.item.phone_type) == 'Fax' :
pass
else :
if self.phonenumber <> '' :
self.phonenumber = self.phonenumber + ' / '

self.phonenumber = self.phonenumber + '(' +
str(self.item.phone_type) + ') ' + str(self.item.phone_number)

send_text = send_text + self.phonenumber + '\n\n'

sendmail(send_from,send_to,send_subject,send_text,send_files) #Send
the warning email
self.send_to = '' #Clear the entry
self.send_to_subject = ''



#Save the contact entry (in case of new record)
super(Contacts, self).save(*args, **kwargs) #Save the contact entry
(in case of new record)




Happy Wednesday !!!
Thanks - paul

Paul Kudla


Scom.ca Internet Services <http://www.scom.ca>
004-1009 Byron Street South
Whitby, Ontario - Canada
L1N 4S3

Toronto 416.642.7266
Main 1.866.411.7266
Fax 1.888.892.7266
Email pa...@scom.ca
> <http://self.product.id/>)
> <http://self.product.id/>)
> --
> You received this message because you are subscribed to the Google
> Groups "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to django-users...@googlegroups.com
> <mailto:django-users...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/59e95c89-1d77-4a61-9d1e-bd7846ca3c35n%40googlegroups.com <https://groups.google.com/d/msgid/django-users/59e95c89-1d77-4a61-9d1e-bd7846ca3c35n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.

Anh Nguyen

unread,
Aug 17, 2022, 5:08:24 PM8/17/22
to django...@googlegroups.com

Problem is you try to use sth you can’t control it.
You should not modify admin page. Try to create a new one as your knowledge. That way keep you learn and stay away unpredictable issues.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/64870ff9-13fd-0cc8-4151-a1faaef9b0e3%40scom.ca.
Reply all
Reply to author
Forward
0 new messages