Django-Oscar Basket定制

时间:2018-11-30 12:23:10

标签: django-forms django-oscar django-formwizard

我正在将Djnago-oscar用于基于太阳能设备的电子商务网站。我需要使用“电池名称”,“注释”和“电池名称”为“购物篮”模型添加一个选项 “制造商”。有一个原因我不想在子类AbstractProduct中添加它。而是我想用子类Basket模型来构建它。 现在,我需要帮助来了解我的工作流程,以使其能够使用AddToBasket表单。在Django-oscar / basket中,有使用formset factory和form的formets.py。 我有些困惑,决定从社区寻求帮助。

以下是代码:

models.py

MANUFACTURERS = (
    ('UPS SYSTEMS', 'UPS SYSTEMS'),
    ('VOLTA', 'VOLTA'),
    ('TOSHIBA ', 'TOSHIBA '),
)

BATTERIES = (
    ('LITHIUM', 'LITHIUM'),
    ('NICAD', 'NICAD'),
    ('NIFE ', 'NIFE '),
)

class AddBattery(AbstractBasket):
    battery_name = models.CharField(max_length=1, choices=BATTERIES)
    manufacturers = models.CharField(max_length=1, choices=MANUFACTURERS)
    price = models.DecimalField(decimal_places=2, max_digits=6)
    notes = models.CharField(max_length=200, null=True, blank=True)

    def __str__(self):
        return self.battery_name


class Basket(AbstractBasket):
    add_bat=models.ForeignKey(_(u'Add a Batter'), to=AddBattery, null=True, blank=True)

forms.py

from django import forms
from django.conf import settings
from django.db.models import Sum
from django.utils.translation import ugettext_lazy as _

from oscar.forms import widgets
from oscar.apps.basket.forms import BasketLineForm as CoreBasketLineForm,\
SavedLineForm as CoreSavedLineForm, BasketVoucherForm as CoreBasketVoucherForm,\
AddToBasketForm as CoreAddToBasketForm

from .models import AddBattery
from oscar.core.loading import get_model, get_classes

Line = get_model('basket', 'line')
Basket = get_model('basket', 'basket')
Product = get_model('catalogue', 'product')



class BasketLineForm(CoreBasketLineForm):
    class AddBatteryForm(CoreBasketLineForm.Meta):
        model = AddBattery
        fields = ['battery_name', 'manufacturers', 'comment']

views.py

我需要帮助弄清楚这部分,因为它有太多的嵌套元素,我无法正确理解。 非常感谢您的帮助。

模板: 我可以解决这个问题,因为我需要管理员才能添加它,但最终用户只能选择价格。 根据客户的选择,我需要将产品和电池的价格统一起来。这部分的任何建议也将很好 关于如何从购物车中的两者中获取合并价格以进行结帐。

2 个答案:

答案 0 :(得分:3)

  1. 请勿在“购物篮”模型中添加您的字段。您需要替代Line模型。
  2. 子类forms.py和formsets.py。您只需要更改BasketLineForm,SavedLineForm和AddBasketForm。将这些子类化为自己的形式后。保留其余的表格。
  3. 您自己的表单集中的
  4. BaseBasketLineFormSet和BaseSavedLineFormSet子类可以根据需要进行编辑。
  5. 通过提供您添加的表单,表单集和args / kwargs来分类BasketView和AddBasketView。
  6. 将模板目录从应用程序复制到您自己的文件夹中,然后如上文作为最后一部分所述将表单添加到basket_total.html。

但是,正如其他人所解释的那样,这违背了工作流程。就编程而言,在任何情况下都没有任何限制。但是,您应该始终考虑解决问题的最合理途径。

答案 1 :(得分:1)

这是一个非常广泛的问题,包含几个不同的组件。我可以为您提供以下建议:

  1. 几乎可以肯定,在购物篮模型中执行此操作将无法很好地为您服务,因为您将无法在创建自定义信息时将其传递给订单对象。更重要的是,您尝试做的事情似乎并不是一揽子问题,而只是产品/变体问题(见下文)。

  2. 从您的描述中我可以看到两种可能性:

    a。电池是用户与主要产品一起购买的单独产品。它有自己的价格和可用性。

    b。电池不是单独的产品,它只是客户购买主要产品时固定选择的一种。

如果是(a),则您只需要拥有单独的产品,以及一些逻辑,该逻辑允许用户与主要产品同时选择附件产品(电池),并同时将其添加到购物篮中。

如果是(b),则本质上是variants,其中一种产品具有多种定价不同的变化。在这种情况下,您应该使用Oscar的内置变体支持。

在任何情况下,修改购物篮模型都会给IMO带来很多问题。