在一个购物车模型内合计Django Admin中每个表格行条目的小计

2024-10-08 19:22:31 发布

您现在位置:Python中文网/ 问答频道 /正文

不确定这是否可行,但在Django Admin中的购物车(model class)详细视图中,我希望汇总所有表格行条目模型类小计,并将该值保存到我的购物车的total-price属性中。有没有一种方法可以做到这一点,或者以某种方式使用过滤器或表单小部件将所有小计添加到一起以达到相同的目的?提前感谢您的帮助!在

下面是我想做的一个例子。您可以看到在总价字段中我手工输入了130(小计:90+20+20=130)。我希望每次从库存中添加一个条目时自动计算这个值,并编辑它的数量。在

enter image description here

到目前为止管理员py我有一个tablarinline管理类,它通过将每个条目的数量乘以相应的价格来返回每个条目的小计。然后,我的CartAdmin类在cart模型详细信息视图中显示内联关系。在

管理员py

class EntryInline(admin.TabularInline):
    model = Entry
    extra = 0
    readonly_fields = ['subtotal']
    exclude = ['price']
    def subtotal(self, obj):
        return "$" + str(obj.quantity * obj.inventory.price)


class CartAdmin(admin.ModelAdmin):
    inlines = [EntryInline]
    fieldsets = (
        (None, {
            'fields':('user', 'total_price')
            }),
    )

模型.py

^{pr2}$

Tags: py模型目的视图obj数量model管理员
3条回答

嗯,我还在研究一种方法,当我在管理详细视图中编辑数量时,通过AJAX请求刷新浏览器,以查看对购物车服务器端总价的更新更改。不知道要花多长时间,但我会尽快更新这个答案。在

同时,我是如何得到小计和总计的:


模型.py我在条目模型中添加了一个字段“subtotal”:

subtotal = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)

管理员py:

^{pr2}$

**需要注意的是,当我编辑数量并保存时,小计是动态加载的,因为它使用了helper方法。我仍然需要再次刷新浏览器以保存到数据库中,但是显示仍然存在。我不知道为什么get_total()的工作方式不一样;没有显示,我必须刷新浏览器才能保存到数据库。逻辑似乎不一致。。。在

您可以尝试在cart admin中获取总价,并将字段填充为:

class CartAdmin(admin.ModelAdmin):
    inlines = [EntryInline]
    fieldsets = (
    (None, {
        'fields':('user', 'total_price')
        }),
    )

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        # check if the cart object exists
        if obj:
            try:
                _price = Entry.objects.filter(cart=obj).aggregate(sum=Sum(F('quantity')*F('inventory__price'), output_field=FloatField()))
                total = _price['sum']
                obj.total_price = total
            except:
                pass
    return form

对于您的导入错误,导入F和Sum为:

^{pr2}$

或者,如果您想要更动态的控制,这样每当用户在内联编辑条目中的数量时,总价格就会自动更新—您可以为它编写定制的javascript。在

希望有帮助。在

以下是我在“管理”中保存后用于刷新页面以更新总计的内容:

购物车.js

if (!$) {
    $ = django.jQuery;
 }
function addSecs(d, s) {
    return new Date(d.valueOf() + s * 1000);
}
function doRun() {
    document.getElementById("msg").innerHTML = "Processing JS...";
    setTimeout(function() {
        start = new Date();
        end = addSecs(start, 5);
        do {
            start = new Date();
        } while (end - start > 0);
        document.getElementById("msg").innerHTML = "Finished Processing";
    }, 10);
 }
$(function() {
    $(".change_form_save").click(doRun);

    if (window.localStorage) {
        if (!localStorage.getItem("firstLoad")) {
            localStorage["firstLoad"] = true;
            window.location.reload();
        } else localStorage.removeItem("firstLoad");
    }
});

然后在我的管理员py在我为CartAdmin上课的时候(管理模型管理员)公司名称:

^{pr2}$

相关问题 更多 >

    热门问题