Como fazer Cálculos no admin.

310 views
Skip to first unread message

Ernesto Figueiredo

unread,
Aug 16, 2015, 1:51:47 AM8/16/15
to Django Brasil
Tudo bom pessoal.
Sou novato no Django e como forma de estudo estou tentando desenvolver um aplicação de controle de caixa simples para uso pessoal.
Minha duvida é a seguinte:
- Fazer com que o admin faça as operações em tempo real e as grave no banco.
  Ex: quando eu colocar o produto e a quantidade ele informar de imediato os valores em um campo que não pode ser alterado pelo usuário. 

model.py
<code>
   
from django.db import models
from django.utils import timezone
from cproduto.models import Produto

class VendaTotal(models.Model):

    FORMA_PAGAMENTO = (
        ('D', 'Dinheiro'),
        ('C', 'Cartão'),
        ('N', 'Nota'),
    )

    tdata = models.DateTimeField('Data', default = timezone.now)
    tforma_pagamento = models.CharField('Forma de Pagamento', max_length=1, choices=FORMA_PAGAMENTO, default='D')
    tdesconto = models.DecimalField('Desconto', default=0, max_digits=6, decimal_places=2)
    ttotal = models.DecimalField('Total', default=0, max_digits=6, decimal_places=2)

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

class VendaNew(models.Model):


    codigo = models.ForeignKey(VendaTotal)
    codigo2 = models.ForeignKey(Produto)
    quantidade = models.IntegerField('Quantidade', default=0)
    desconto = models.DecimalField('Desconto', default=0, max_digits=6, decimal_places=2)
    total = models.DecimalField('Total', default=0, max_digits=6, decimal_places=2)

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

    def get_total(self):
        totals = (self.codigo2.preco_venda * self.quantidade - self.desconto)
        self.total = totals
        self.save()
        return self.total
    subtotal = property(get_total) 

</code> 

admin.py
<code>

from django.contrib import admin
from cvenda.models import *

class VendaNewAdmin(admin.TabularInline):
    model = VendaNew
    raw_id_fields = ('codigo2',)
    extra = 0
    readonly_fields = ['subtotal']
    

class VendaTotalAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Data',                 {'fields' : ['tdata']}),
        ('Forma de pagamento',   {'fields' : ['tforma_pagamento']}),
        ('Desconto',             {'fields' : ['tdesconto']}),
        ('Total',                {'fields' : ['ttotal']}),
    ]
    inlines = [VendaNewAdmin]
    list_display = ('id', 'tdata', 'tforma_pagamento', 'tdesconto', 'ttotal')

admin.site.register(VendaTotal, VendaTotalAdmin)

</code>

Se alguém poder me orientar, agradeço.
Obrigado.

Andre Duarte

unread,
Aug 18, 2015, 5:30:08 PM8/18/15
to Django Brasil
Ernesto,

O admin do Django é apenas um facilitador que vai te livrar de muito código para CRUD mas por rodar exclusivamente no backend não facilita muito cálculos em tempo real.
Bem, você pode apelar para a customização do admin. No seu caso é possível sobrescrever [0] o template change_form.html para adicionar um javascript que faça a chamada Ajax e realize as ações desejadas no backEnd (view) retornando o resultado para seu frontEnd(template). O javascript pode ser passado via Admin também [1] mas fica mais claro sobrescrevendo o template.

[0] https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#overriding-admin-templates
[1] https://docs.djangoproject.com/en/1.8/topics/forms/media/#assets-as-a-static-definition ou http://stackoverflow.com/questions/2504054/overriding-the-admin-media-class

Ernesto Figueiredo

unread,
Aug 19, 2015, 4:34:02 PM8/19/15
to Django Brasil
Andre Duarte, muito obrigado pela reposta. Ajudou bastante a direcionar minhas pesquisas.

Entretanto gostaria de saber se você ou algum membro do grupo  possui algum tipo de exemplo, utilizando o javascript para fazer os cálculos dentro do change_form.html.( preco_venda * quantidade) levando em consideração os campos do form. #id_

Valeu!!!

Danilo Shiga

unread,
Aug 19, 2015, 9:39:45 PM8/19/15
to Django Brasil
Ernesto, dê uma olhada nesse projeto, ele coloca funcionalidades de de agregação (somas, médias, etc) no admin do Django


--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Andre Duarte

unread,
Sep 2, 2015, 8:01:05 AM9/2/15
to Django Brasil
Ernesto, se o que você quer é simplesmente calcular o valor dos campos que estão na tela e mostra o total, isso é javascript e para facilitar você pode usar o jquery.
Fiz um exemplo beeeeeem simples 
var preco_venda = parseFloat( $('#seu_elemento_preco_venda').val() );
var quantidade = $('#seu_elemento_qtde').val();
var total = preco_venda * quantidade;
//mostra em algum lugar o resultado
$('#id_sua_tag_mostra_valor').html(total);

Agora se precisar fazer via ajax(o calculo vai ser no backEnd) então use o $.ajax() ou $.get(), $.getJSON()$.post(), etc.
Reply all
Reply to author
Forward
0 new messages