Django-Oscar 篮子定制
Django-Oscar Basket customization
我将 Djnago-oscar 用于基于太阳能设备的电子商务网站。我需要使用 "Battery Name"、"Notes" 和 "Basket" 模型添加一个选项
"Manufacturer"。我不想将它添加到子类 AbstractProduct 中是有原因的。相反,我想用子类 Basket 模型来构建它。
现在我需要帮助来理解我的工作流程,以便使用 AddToBasket 表单进行这项工作。在 Django-oscar/basket 中有 formsets.py 使用 formset factory 和一个表单。
我有点困惑,决定向社区寻求帮助。
代码如下:
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
我需要帮助来计算这部分,因为它有太多的嵌套元素,我无法正确处理。
非常感谢您的帮助。
模板:
我可以解决这个问题,因为我需要管理员能够添加它,但最终用户只能从价格中选择 select。
根据客户的 selection,我需要对产品和电池进行合并价格。对这部分的任何建议也很好
关于如何从购物车中获取合并价格以进行结帐。
这是一个非常广泛的问题,包含几个不同的组成部分。我可以提供以下建议供您研究:
在购物车模型中这样做几乎肯定不会很好地为您服务,因为您将无法在订单对象创建时将其传递给订单对象。更重要的是,您尝试做的似乎不是购物篮问题,只是 product/variant 问题(见下文)。
根据你的描述我可以看出两种可能:
一个。电池是用户与主要产品一起购买的单独产品。它有自己的定价和可用性。
b。电池不是单独的产品,它只是客户在购买主要产品时的一组固定选择之一。
如果 (a),那么您只需要有单独的产品,以及允许用户在主产品的同时 select 附属产品(电池)的一些逻辑,并且添加两人同时上篮。
如果 (b),则这些本质上是 variants,其中一种产品有多种定价不同的变体。在这种情况下,您应该使用 Oscar 对变体的内置支持。
无论如何,修改篮子模型会给你带来很多IMO问题。
- 不要在购物篮模型中添加字段。您需要改为子类化 Line 模型。
- 子类 forms.py 和 formsets.py。您只需更改 BasketLineForm、SavedLineForm 和 AddBasketForm。在您以自己的形式对它们进行子类化之后。留下其余的表格。
- 您自己的表单集中的子类 BaseBasketLineFormSet 和 BaseSavedLineFormSet 根据您的需要进行编辑。
- 通过提供您添加的表单、表单集和 args/kwargs 子类化 BasketView 和 AddBasketView。
- 将模板目录从应用程序复制到您自己的文件夹,并在 basket_total.html 添加表单,如上文所述作为最后一部分。
但话虽这么说……这与其他人解释的工作流程背道而驰。就编程而言,您在任何情况下都没有任何限制。但是您应该始终考虑解决问题的最合理途径。
我将 Djnago-oscar 用于基于太阳能设备的电子商务网站。我需要使用 "Battery Name"、"Notes" 和 "Basket" 模型添加一个选项 "Manufacturer"。我不想将它添加到子类 AbstractProduct 中是有原因的。相反,我想用子类 Basket 模型来构建它。 现在我需要帮助来理解我的工作流程,以便使用 AddToBasket 表单进行这项工作。在 Django-oscar/basket 中有 formsets.py 使用 formset factory 和一个表单。 我有点困惑,决定向社区寻求帮助。
代码如下:
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
我需要帮助来计算这部分,因为它有太多的嵌套元素,我无法正确处理。 非常感谢您的帮助。
模板: 我可以解决这个问题,因为我需要管理员能够添加它,但最终用户只能从价格中选择 select。 根据客户的 selection,我需要对产品和电池进行合并价格。对这部分的任何建议也很好 关于如何从购物车中获取合并价格以进行结帐。
这是一个非常广泛的问题,包含几个不同的组成部分。我可以提供以下建议供您研究:
在购物车模型中这样做几乎肯定不会很好地为您服务,因为您将无法在订单对象创建时将其传递给订单对象。更重要的是,您尝试做的似乎不是购物篮问题,只是 product/variant 问题(见下文)。
根据你的描述我可以看出两种可能:
一个。电池是用户与主要产品一起购买的单独产品。它有自己的定价和可用性。
b。电池不是单独的产品,它只是客户在购买主要产品时的一组固定选择之一。
如果 (a),那么您只需要有单独的产品,以及允许用户在主产品的同时 select 附属产品(电池)的一些逻辑,并且添加两人同时上篮。
如果 (b),则这些本质上是 variants,其中一种产品有多种定价不同的变体。在这种情况下,您应该使用 Oscar 对变体的内置支持。
无论如何,修改篮子模型会给你带来很多IMO问题。
- 不要在购物篮模型中添加字段。您需要改为子类化 Line 模型。
- 子类 forms.py 和 formsets.py。您只需更改 BasketLineForm、SavedLineForm 和 AddBasketForm。在您以自己的形式对它们进行子类化之后。留下其余的表格。
- 您自己的表单集中的子类 BaseBasketLineFormSet 和 BaseSavedLineFormSet 根据您的需要进行编辑。
- 通过提供您添加的表单、表单集和 args/kwargs 子类化 BasketView 和 AddBasketView。
- 将模板目录从应用程序复制到您自己的文件夹,并在 basket_total.html 添加表单,如上文所述作为最后一部分。
但话虽这么说……这与其他人解释的工作流程背道而驰。就编程而言,您在任何情况下都没有任何限制。但是您应该始终考虑解决问题的最合理途径。