【问题标题】:Django-Oscar Basket customizationDjango-奥斯卡篮子定制
【发布时间】:2019-05-02 14:38:12
【问题描述】:

我正在将 Djnago-oscar 用于基于太阳能设备的电子商务网站。我需要为“Basket”模型添加一个选项,其中包含“Battery Name”、“Notes”和 “制造商”。我不想在子类 AbstractProduct 中添加它是有原因的。相反,我想用子类 Basket 模型构建它。 现在我需要帮助来了解我的工作流程,以便使用 AddToBasket 表单进行这项工作。在 Django-oscar/basket 中有使用 formset 工厂和表单的 formsets.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

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

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

【问题讨论】:

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


    【解决方案1】:
    1. 不要在篮子模型中添加您的字段。您需要改为对 Line 模型进行子类化。
    2. 子类 forms.py 和 formsets.py。您只需要更改 BasketLineForm、SavedLineForm 和 AddBasketForm。在您以自己的形式对这些进行子类化之后。留下其余的表格。
    3. 根据需要在您自己的表单集中编辑 BaseBasketLineFormSet 和 BaseSavedLineFormSet 的子类。
    4. 通过提供您添加的表单、表单集和 args/kwargs 子类 BasketView 和 AddBasketView。
    5. 将模板目录从应用程序复制到您自己的文件夹,并在上面提到的最后一部分在 basket_total.html 中添加表单。

    但话虽如此...它与其他人解释的工作流程背道而驰。就编程而言,在任何情况下对您都没有任何限制。但是您应该始终考虑解决问题的最合理途径。

    【讨论】:

    • 为什么不把它加到篮子里呢?有道理吗?
    • 篮子被锁定并添加了线。行包括所有与产品相关的属性/功能等。向篮子添加新字段意味着您将不得不重做篮子的整个结构。休息由您决定。这是最接近您想要的。而是使用 Oscar 内置功能的解决方案。
    • 有道理。我一定会试试这个,如果我有问题会更新你。谢谢。
    【解决方案2】:

    这是一个涉及多个不同组成部分的非常广泛的问题。我可以提供以下建议供您研究:

    1. 在篮子模型中这样做几乎肯定不会为您提供很好的服务,因为您将无法在创建订单对象时将此自定义信息传递给它。更重要的是,您尝试做的似乎不是篮子问题,只是产品/变体问题(见下文)。

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

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

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

    如果是 (a),那么您只需要拥有单独的产品,以及一些允许用户在选择主要产品(电池)的同时选择辅助产品(电池)并将两者同时添加到购物篮的逻辑。

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

    无论如何,修改篮子模型会给你带来很多IMO问题。

    【讨论】:

    • 您能否仍然用工作流更新答案,至少应该解释继承视图的地图。如果有问题我会处理。我会非常感谢你。
    • 并非如此,因为您首先需要确定哪种方法对您最有意义 - 我在上面描述了两种可能的方法。如果您使用变体,那么几乎没有什么可做的,因为这些都是开箱即用的支持。
    • 我当然想选择选项 1,因为我想有了这个,我真的能够在没有更多帮助的情况下解决很多 Django-Oscar 问题。
    • @ShaziaNusrat 使用变体会更简单,就像 solarissmoke 指出的那样。 Oscar 对此具有内置支持,否则(选项 1)将会有很多变通方法,可能会导致其他错误/令人头疼的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2016-07-14
    相关资源
    最近更新 更多