[PYTHON] Django Oscar (EC Package) Guide d'utilisation du Japon

Django, le framework web full-stack (probablement) le plus utilisé en Python. Oscar, (probablement) le package EC le plus dynamique qui fonctionne sur ce Django.

J'ai écrit l'Oscar comme guide pour l'utiliser au Japon.

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

Dépôt: https://github.com/django-oscar/django-oscar

Caractéristiques d'Oscar

Fonctions incluses depuis le début

Tel.

Il est relativement facile de désactiver des fonctionnalités telles que les avis. (Disponible dans les paramètres)

À propos, il n'inclut pas la fonction "point" qui est courante au Japon.

Modèle fourche

Si vous souhaitez étendre (hériter) de la fonction Oscar standard, utilisez une fonction appelée fork.

Tout d'abord, créez un répertoire tel que oscar_fork (ou myapps) directement sous le projet.

$ ./manage.py oscar_fork_app catalogue oscar_fork

Si vous exécutez, oscar_fork / catalog sera créé.

Dans ce module de fourche

Etc.

Exemple supplémentaire de champ de modèle

Par exemple, si vous souhaitez ajouter un champ miniature_url au catalogue.

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

Vers INSTALLED_APPS

settings.py


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

Étendez INSTALLED_APPS en écrivant.

Un fichier de migration peut être créé avec ./manage.py makemigrations, utilisez donc ./manage.py migrate pour migrer le schéma.

Afficher l'extension

Si vous souhaitez agrandir la vue de votre panier (paiement)

$ ./manage.py oscar_fork_app checkout oscar_fork

après

python:oscar_fork/checkout.views.py


from oscar.apps.checkout import views

class IndexView(views.IndexView):
    def get(self, request, *args, **kwargs):
        #obtenir le traitement...

Vous pouvez écrire comme ça.

Également ajouté à INSTALLED_APPS

settings.py


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

Ajouter et modifier des URL

Si vous souhaitez ajouter ou désactiver des URL, écrivez 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'),

Vous pouvez le désactiver en commentant l'URL du registre.

Également ajouté à INSTALLED_APPS. (Détails omis)

Comment l'utiliser pour le Japon

Tout d'abord, définissez les paramètres Django pour le Japon.

settings.py


LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

Paramètres spécifiques aux Oscars pour le Japon

settings.py


OSCAR_DEFAULT_CURRENCY = 'JPY'

OSCAR_CURRENCY_FORMAT = '¤#,##0'

Pays enregistré uniquement au Japon

$ ./manage.py oscar_populate_countries

Ainsi, le modèle de pays (adresse_pays) contient les données initiales pour 249 pays.

Si is_shipping_country est défini sur 1 pour le Japon uniquement et 0 pour les autres, la sélection du nom du pays n'apparaîtra pas lors de l'enregistrement d'une adresse (le Japon sera la valeur par défaut).

Depuis le shell Django ou en SQL.

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

Écrire et traduire des fichiers PO

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

Reportez-vous ici

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

(Si cela ne fonctionne pas, peut-être que gettext n'est pas installé. Dans mon cas (mac), j'avais besoin de brew install gettext --force)

Modifier les paramètres régionaux / ja / LC_MESSAGES / django.po

msgid "email address"
msgstr "adresse mail"

msgid "First name"
msgstr "Nom de famille"

msgid "Last name"
msgstr "Nom"

msgid "View basket"
msgstr "Voir le panier"

msgid "Basket total"
msgstr "montant total"

msgid "Basket total:"
msgstr "montant total:"

msgid "In stock"
msgstr "En stock"

msgid "Shipping"
msgstr "livraison"

msgid "Total"
msgstr "total"

msgid "Order total"
msgstr "montant total"

msgid "State/County"
msgstr "Préfectures"

msgid "City"
msgstr "Municipalité"

msgid "First line of address"
msgstr "Nom de la ville/Personnage/adresse"

msgid "Second line of address"
msgstr "bâtiment/numéro de chambre"

...

(* Prénom = nom de famille, nom = prénom est écrit intentionnellement et n'est pas faux. C'est plus facile à utiliser pour moi.)

Après avoir écrit le fichier po,

$ ./manage.py compilemessages

Pour créer un fichier mo. Le site est maintenant affiché en japonais.

Changement de taux d'imposition

La valeur par défaut est un taux d'imposition fixe de 0%. Le Japon a une taxe à la consommation de 8%, elle doit donc être modifiée.

Le taux de taxe est dans partner / strategy.py

$ ./manage.py oscar_fork_app partner oscar_fork

après,

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

Vous pouvez l'écrire comme ça.

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

J'ai écrit ceci. Dans ce cas, le montant après la virgule décimale est traité tel quel. Par exemple, dans le cas d'un produit de 70 yens HT, il est calculé en interne à 75,6 yens TTC. Considérez après le point décimal.

Ce n'était pas pratique pour mon service, donc je l'ai changé comme suit

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

Arrondi au nombre entier le plus proche. Pour les produits de 70 yens hors taxes, il sera de 76 yens TTC.

Cette fois, je voulais tronquer après la virgule décimale, alors j'ai remplacé les méthodes pricing_policy et parent_pricing_policy et mis rounding = ROUND_DOWN dans l'argument de la méthode quantize de Decimal.

Ce n'est pas un peu élégant de remplacer la méthode entière simplement parce que vous vouliez la tronquer. Y a-t-il un bon moyen?

Je me demande si cela peut être réalisé avec decimal.setcontext. Je ne peux pas le faire parce que cela semble avoir d'autres effets.

Ajouté à INSTALLED_APPS comme d'habitude

settings.py


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

Puisque vous pouvez écrire des branches, etc. avec la logique, vous pouvez également écrire des traitements compliqués. Droits de douane, etc.

Je pense qu'il peut être utilisé presque au Japon.

Le reste est la création et la traduction de modèles.

Où est la première page?

Au fait. La première page est en promotions. Les vues sont ʻoscar.apps.promotions.views.HomeView, Le modèle est promotions / home.html`. Il faudra un certain temps pour le trouver, alors je vais l'écrire.

Autres fonctions nécessaires

Module de paiement

paypal semble être relativement facile à utiliser avec le module django-oscar-paypal. Prend en charge le paiement express et le paiement. Peut-être que le paiement express n'est qu'un lien.

J'ai décidé de le faire avec webpay, alors je l'ai écrit moi-même.

Il sera écrit en remplaçant le handle_payment de payment.views.PaymentDetailsView.

Recommended Posts

Django Oscar (EC Package) Guide d'utilisation du Japon
tutoriel simple django oscar