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
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.
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.
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.
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',
])
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)
settings.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
settings.py
OSCAR_DEFAULT_CURRENCY = 'JPY'
OSCAR_CURRENCY_FORMAT = '¤#,##0'
$ ./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';
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.
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.
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.
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.