Джанго-Оскар Корзина - PullRequest
0 голосов
/ 30 ноября 2018

Я использую Djnago-oscar для сайта электронной коммерции, основанного на солнечном энергетическом оборудовании.Мне нужно добавить опцию в «Корзину» модели с «Имя батареи», «Примечания» и «Производитель».Есть причина, по которой я не хочу добавлять ее в подкласс AbstractProduct.Скорее я хочу построить его с моделью подкласса Basket.Теперь мне нужна помощь, чтобы понять мой рабочий процесс, чтобы заставить это работать с формой AddToBasket.В Django-oscar / basket есть файл 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

Мне нужна помощь, чтобы понять эту часть, потому что она имеет так много вложенных элементов, и я не могсделай это правильно.Помощь очень ценится.

Шаблоны: Я могу решить это, потому что мне нужен администратор, чтобы иметь возможность добавить его, но только у конечного пользователя будет возможность выбирать из с ценой.При выборе клиента мне нужно иметь сводную цену с продуктами и плюс батарею.Любой совет для этой части также будет полезен для получения сводной цены в корзине для оформления заказа.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018
  1. Не добавляйте свои поля в модели корзины.Вместо этого вам нужно создать подкласс линейной модели.
  2. Подкласс form.py и formsets.py.Вам нужно только изменить BasketLineForm, SavedLineForm и AddBasketForm.После того, как вы подкласс их в своих собственных формах.Оставьте остальные формы.
  3. Подкласс BaseBasketLineFormSet и BaseSavedLineFormSet в ваших собственных наборах форм редактировать в соответствии с вашими потребностями.
  4. Подкласс BasketView и AddBasketView, предоставляя формы, наборы форм и аргументы / kwargs, которые вы добавили.
  5. Скопируйте каталог шаблона из приложения в свою папку и добавьте форму в basket_total.html, как вы упоминали выше в качестве последней части.

Но, сказав, что ... это против рабочего процесса, как объяснили другие.В любом случае для вас нет никаких ограничений в отношении программирования.Но вы всегда должны выбирать наиболее разумный путь для решения ваших проблем.

0 голосов
/ 01 декабря 2018

Это очень широкий вопрос с несколькими различными компонентами.Я могу предложить вам следующие предложения:

  1. Выполнение этого в модели корзины почти наверняка не принесет вам пользы, потому что вы не сможете пройти этот заказ.информация к объекту заказа при его создании.Что еще более важно, то, что вы пытаетесь сделать, похоже, не проблема корзины, а проблема продукта / варианта (см. Ниже).

  2. Есть две возможности, которые я вижуиз того, что вы описали:

    а.Аккумулятор - это отдельный продукт, который пользователь покупает вместе с основным продуктом.Он имеет свои цены и наличие.

    b.Батарея не является отдельным продуктом, это всего лишь один из фиксированных вариантов выбора, который покупатель имеет при покупке основного продукта.

Если (а), то вам просто нужноимеют отдельные продукты и некоторую логику, которая позволяет пользователю выбирать вспомогательный продукт (батарею) одновременно с основным продуктом и который добавляет оба товара в корзину одновременно.

Если (b), то этипо сути, это варианты , где один продукт имеет несколько вариантов с разными ценами.В этом случае вам следует использовать встроенную поддержку Оскара для вариантов.

В любом случае, изменение модели корзины вызовет у вас много проблем IMO.

...