[PYTHON] Django Oscar (EC-Paket) Japan Usage Guide

Django, das (wahrscheinlich) am häufigsten verwendete Full-Stack-Webframework in Python. Oscar, (wahrscheinlich) das dynamischste EC-Paket, das auf diesem Django läuft.

Ich habe den Oscar als Leitfaden für die Verwendung in Japan geschrieben.

Django-Oscar-Dokumentation: https://django-oscar.readthedocs.org/

Repository: https://github.com/django-oscar/django-oscar

Eigenschaften von Oscar

Funktionen von Anfang an enthalten

--Überprüfungsfunktion

Eine solche.

Es ist relativ einfach, Funktionen wie Bewertungen auszuschalten. (Verfügbar in den Einstellungen)

Übrigens enthält es nicht die in Japan übliche "Punkt" -Funktion.

Modellgabel

Wenn Sie die Standard-Oscar-Funktion erweitern (erben) möchten, verwenden Sie eine Funktion namens fork.

Erstellen Sie zunächst ein Verzeichnis wie oscar_fork (oder myapps) direkt unter dem Projekt.

$ ./manage.py oscar_fork_app catalogue oscar_fork

Wenn Sie ausführen, wird oscar_fork / catalog erstellt.

In diesem Gabelmodul

Und so weiter.

Zusätzliches Beispiel für ein Modellfeld

Zum Beispiel, wenn Sie catalog.Product ein thumbnail_url-Feld hinzufügen möchten

oscar_fork/catalogue/models.py


from django.db import models
from oscar.apps.catalogue.abstract_models import AbstractProduct

class Product(AbstractProduct):
    image_url = models.URLField(default='', blank=True)
    thumbnail_url = models.URLField(default='', blank=True)

from oscar.apps.catalogue.models import *  # noqa

Zu INSTALLED_APPS

settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    ....
]
INSTALLED_APPS += get_core_apps([
    'oscar_fork.catalogue',
])

Erweitern Sie INSTALLED_APPS durch Schreiben.

Eine Migrationsdatei kann mit "./manage.py makemigrations" erstellt werden. Verwenden Sie daher "./manage.py migrate", um das Schema zu migrieren.

Erweiterung anzeigen

Wenn Sie die Ansicht Ihres Warenkorbs erweitern möchten (Kasse)

$ ./manage.py oscar_fork_app checkout oscar_fork

nach

python:oscar_fork/checkout.views.py


from oscar.apps.checkout import views

class IndexView(views.IndexView):
    def get(self, request, *args, **kwargs):
        #Verarbeitung bekommen...

Sie können so schreiben.

Wird auch zu INSTALLED_APPS hinzugefügt

settings.py


INSTALLED_APPS += get_core_apps([
    'oscar_fork.catalogue',
    'oscar_fork.checkout',
])

URLs hinzufügen und bearbeiten

Wenn Sie URLs hinzufügen oder deaktivieren möchten, schreiben Sie app.py.

$ ./manage.py oscar_fork_app customer oscar_fork

oscar_fork/customer/app.py


from oscar.apps.customer import app

class CustomerApplication(app.CustomerApplication):
    def get_urls(self):
        urls = [
            # Login, logout and register doesn't require login
            url(r'^login/$', self.login_view.as_view(), name='login'),
            url(r'^logout/$', self.logout_view.as_view(), name='logout'),
            # url(r'^register/$', self.register_view.as_view(),
            # name='register'),

Sie können es deaktivieren, indem Sie die Register-URL auskommentieren.

Wird auch zu INSTALLED_APPS hinzugefügt. (Details weggelassen)

Wie man es für Japan benutzt

Stellen Sie zunächst die Django-Einstellungen für Japan ein.

settings.py


LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

Oscar-spezifische Einstellungen für Japan

settings.py


OSCAR_DEFAULT_CURRENCY = 'JPY'

OSCAR_CURRENCY_FORMAT = '¤#,##0'

Registriertes Land nur in Japan

$ ./manage.py oscar_populate_countries

Das Ländermodell (address_country) enthält also die Anfangsdaten für 249 Länder.

Wenn is_shipping_country nur für Japan auf 1 und für andere auf 0 gesetzt ist, wird die Auswahl des Ländernamens bei der Registrierung einer Adresse nicht angezeigt (Japan ist die Standardeinstellung).

Aus der Django-Shell oder in SQL.

mysql> UPDATE address_country SET is_shipping_country = 0 WHERE printable_name != 'Japan';

PO-Dateien schreiben und übersetzen

How do I translate Oscar? — django-oscar 0.5 documentation https://django-oscar.readthedocs.org/en/releases-0.5/howto/how_do_i_translate_oscar.html

Siehe hier

$ mkdir locale i18n
$ ln -s $PATH_TO_OSCAR i18n/oscar
$ ./manage.py makemessages --symlinks --locale=ja

(Wenn es nicht funktioniert, ist gettext möglicherweise nicht installiert. In meinem Fall (Mac) musste Brew gettext --force installiert werden.)

Bearbeiten Sie das Gebietsschema / ja / LC_MESSAGES / django.po

msgid "email address"
msgstr "Mail Adresse"

msgid "First name"
msgstr "Nachname"

msgid "Last name"
msgstr "Name"

msgid "View basket"
msgstr "Siehe den Wagen"

msgid "Basket total"
msgstr "Gesamtgebühr"

msgid "Basket total:"
msgstr "Gesamtgebühr:"

msgid "In stock"
msgstr "Auf Lager"

msgid "Shipping"
msgstr "Versand"

msgid "Total"
msgstr "Zwischensumme"

msgid "Order total"
msgstr "Gesamtgebühr"

msgid "State/County"
msgstr "Präfekturen"

msgid "City"
msgstr "Gemeinde"

msgid "First line of address"
msgstr "Name der Stadt/Charakter/Adresse"

msgid "Second line of address"
msgstr "Gebäude/Zimmernummer"

...

(* Vorname = Nachname, Nachname = Vorname wurde absichtlich geschrieben und ist nicht falsch. Dies ist für mich einfacher zu verwenden.)

Nach dem Schreiben der po-Datei,

$ ./manage.py compilemessages

So erstellen Sie eine Mo-Datei. Die Seite wird jetzt auf Japanisch angezeigt.

Änderung des Steuersatzes

Der Standardwert ist ein fester Steuersatz von 0%. Japan hat eine Verbrauchssteuer von 8%, daher muss sie geändert werden.

Der Steuersatz ist in partner / strategie.py angegeben

$ ./manage.py oscar_fork_app partner oscar_fork

nach,

oscar_fork/partner/strategy.py


from decimal import Decimal as D
from oscar.apps.partner import strategy

class Selector(object):
    def strategy(self, request=None, user=None, **kwargs):
        return JPStrategy()

class JP(strategy.FixedRateTax):
    rate = D('0.08')
    exponent = D('1.')

    def pricing_policy(self, product, stockrecord):
        if not stockrecord:
            return prices.Unavailable()
        rate = self.get_rate(product, stockrecord)
        exponent = self.get_exponent(stockrecord)
        tax = (stockrecord.price_excl_tax * rate).quantize(
            exponent, rounding=ROUND_DOWN)
        return prices.TaxInclusiveFixedPrice(
            currency=stockrecord.price_currency,
            excl_tax=stockrecord.price_excl_tax,
            tax=tax)

    def parent_pricing_policy(self, product, children_stock):
        stockrecords = [x[1] for x in children_stock if x[1] is not None]
        if not stockrecords:
            return prices.Unavailable()

        # We take price from first record
        stockrecord = stockrecords[0]
        rate = self.get_rate(product, stockrecord)
        exponent = self.get_exponent(stockrecord)
        tax = (stockrecord.price_excl_tax * rate).quantize(
            exponent, rounding=ROUND_DOWN)

        return prices.FixedPrice(
            currency=stockrecord.price_currency,
            excl_tax=stockrecord.price_excl_tax,
            tax=tax)

class JPStrategy(strategy.UseFirstStockRecord, strategy.StockRequired,
                 JP, strategy.Structured):
    pass

Sie können es so schreiben.

class JP(strategy.FixedRateTax):
    rate = D('0.08')

Ich habe das geschrieben. In diesem Fall wird der Betrag nach dem Dezimalpunkt so behandelt, wie er ist. Zum Beispiel wird ein Produkt von 70 Yen ohne Steuern intern als 75,6 Yen ohne Steuern berechnet. Betrachten Sie nach dem Dezimalpunkt.

Dies war für meinen Service unpraktisch, daher habe ich es wie folgt geändert

class JP(strategy.FixedRateTax):
    rate = D('0.08')
    exponent = D('1.')

Auf die nächste ganze Zahl gerundet. Für Produkte von 70 Yen ohne Steuern sind es 76 Yen ohne Steuern.

Dieses Mal wollte ich nach dem Dezimalpunkt abschneiden, also habe ich sowohl die Methoden "price_policy" als auch "parent_pricing_policy" überschrieben und "rounding = ROUND_DOWN" in das Argument der "quantize" -Methode von "decimal" eingefügt.

Es ist etwas unelegant, die gesamte Methode zu überschreiben, nur weil Sie sie abschneiden wollten. Gibt es einen guten Weg?

Ich frage mich, ob es mit decimal.setcontext realisiert werden kann. Ich kann es nicht tun, weil es andere Auswirkungen zu haben scheint.

Wie gewohnt zu INSTALLED_APPS hinzugefügt

settings.py


INSTALLED_APPS += get_core_apps([
    ...
    'oscar_fork.partner',
])

Da Sie Zweige usw. mit Logik schreiben können, können Sie auch komplizierte Verarbeitungen schreiben. Zölle usw.

Ich denke, dass es fast in Japan verwendet werden kann.

Der Rest ist die Erstellung und Übersetzung von Vorlagen.

Wo ist die oberste Seite?

Apropos. Die oberste Seite ist in Aktionen. Die Ansichten sind oscar.apps.promotions.views.HomeView, Die Vorlage lautet "Promotions / Home.html". Es wird einige Zeit dauern, es zu finden, also werde ich es aufschreiben.

Andere notwendige Funktionen

Zahlungsmodul

Paypal scheint mit dem Django-Oscar-Paypal-Modul relativ einfach zu bedienen zu sein. Unterstützt Express Checkout und Payflow. Vielleicht ist Express Checkout nur ein Link.

Ich habe mich für Webpay entschieden und es selbst geschrieben.

Es wird geschrieben, indem die "handle_payment" von "question.views.PaymentDetailsView" überschrieben wird.

Recommended Posts

Django Oscar (EC-Paket) Japan Usage Guide
Django Oscar einfaches Tutorial