Z pewnością naczytałeś się już, jakie to Satchmo nie jest doskonałe, zazdrościsz i chciałbyś stworzyć coś równie wspaniałego. Dość jednak nieprzespanych nocy, albowiem przygotowałem krótki poradnik, który w kilku krokach pozwoli ci dorównać mistrzom.
Sięgaj tam, gdzie import nie sięga
Tak jest, zacznij od stworzenia modułu z myślnikiem w nazwie. Niestety, oczywista nazwa email-auth.py
została już zajęta — musisz się bardziej wysilić. Znajomym oczy wypadną z zazdrości, gdy tylko pierwszy raz zobaczą:
hahaha = __import__('pokonalem-was', globals(), locals(), [], -1)
Uatrakcyjniaj pętle
Od dawna wiadomo już, że przedwczesna optymalizacja jest złem, naszą odpowiedzią będzie zatem przedwczesna dezoptymalizacja
! Oto przykład atrakcyjnego wyświetlenia listy:
{% for product in products %}
{% if forloop.first %} <ul> {% endif %}
<li>{% thumbnail product.main_image.picture 85x85 as image %}
<a href="{{ product.get_absolute_url }}"><img src="{{ image }}" width="{{ image.width }}" height="{{ image.height }}" /></a>
<a href="{{ product.get_absolute_url }}">{{ product.translated_name }}</a></li>
{% if forloop.last %} </ul> {% endif %}
{% endfor %}
Tylko wyobraź sobie ich miny! Jeśli chcesz przeskoczyć mistrza, spróbuj przenieść kod do Pythona:
for counter, product in enumerate(products):
if counter == 0:
print '<ul>'
# ...i tak dalej
Nie daj się zaszufladkować
Nie łudźmy się — przestrzenie nazw są dla frajerów. Bez ceregieli pakuj wszystko w ścieżkę Pythona i upewnij się, że tak właśnie importujesz swoje moduły. Pokaż, że jesteś ważniakiem i twórz moduły o jak najogólniejszych nazwach. Naucz fajansów pokory, tych kilka dodatkowych wpisów w PYTHONPATH
ich nie zabije. Mogą to zrobić konflikty, ale jeśli chcą używać czegoś ponad twój framework, to sami są sobie winni i zasłużyli na karę.
export PYTHONPATH=~/web/satchmo/satchmo/apps
Unikaj biurokracji
Po co męczyć się z formularzami, gdy do wszystkiego sięgnąć można już w widoku? Niezwykle istotne jest tu unikanie request.REQUEST
.
if request.method=="POST":
reqdata = request.POST
else:
reqdata = request.GET
if reqdata.has_key('quantity'):
try:
quantity = round_decimal(reqdata['quantity'], places=2, roundfactor=.25)
except RoundedDecimalError:
quantity = Decimal('1.0')
log.warn("Could not parse a decimal from '%s', returning '1.0'", reqdata['quantity'])
else:
quantity = Decimal('1.0')
Jeśli już musisz użyć formularza, upewnij się, że upakujesz wszystkie, niezwiązane ze sobą grupy pól w jednej dużej klasie. Dzięki temu zaoszczędzisz sobie kilka wywołań is_valid()
i jednocześnie udaremnisz wszelkie próby innego wykorzystania poszczególnych części przez te niedorozwoje, które mają czelność importować twoje klasy.
Wyznaczaj nowe trendy
Przez takich jak oni, programowanie obiektowe stoi praktycznie w miejscu. Pokaż im nowe sztuczki, takie jak zastąpienie rozszerzania klas nadpisywaniem funkcji w locie¹:
def confirm_info(request, template='shop/checkout/protx/confirm.html', extra_context={}):
payment_module = config_get_group('PAYMENT_PROTX')
controller = confirm.ConfirmController(request, payment_module)
controller.templates['CONFIRM'] = template
controller.extra_context = extra_context
controller.onForm = secure3d_form_handler
controller.confirm()
return controller.response
¹ W rzeczywistości ConfirmController.onForm
jest w konstruktorze klasy ustawiany na ConfirmController._onForm
, co można uznać za architekturę po dwakroć lepszą.
Parametry dobieraj z rozmachem
Piękno tkwi w różnorodności. Upewnij się zatem, że wyczerpiesz wszelkie metody osiągnięcia tego samego celu.
class ProductImage(models.Model):
# ...
picture = ImageWithThumbnailField(verbose_name=_('Picture'),
upload_to="__DYNAMIC__",
name_field="_filename",
max_length=200)
# ...
class ImageWithThumbnailField(ImageField):
# ...
def __init__(self, verbose_name=None, name=None,
width_field=None, height_field=None,
auto_rename=NOTSET, name_field=None,
upload_to=upload_dir, **kwargs):
# ...
if upload_to == "__DYNAMIC__":
upload_to = upload_dir
# ...
Bądź elastyczny
Teraz twój sklep znajduje się w Polsce, ale kto wie, co będzie po obiedzie? Upewnij się, że cała konfiguracja może być edytowana w locie. Zwłaszcza te jej fragmenty, które wymagają restartu aplikacji. To jedna z wielu sztuczek, które zapewnią ci popularność w branży. Co prawda dawni przyjaciele zazdroszczą ci już do tego stopnia, że przestali się do ciebie odzywać, ale i tak nie tęsknisz po tych prostakach. Od teraz twoim jedynym przyjacielem jest aplikacja django-livesettings. Na innych nie masz szans, bo przyjaciół poznaje się w biedzie, a ty przecież właśnie zyskałeś umiejętności, dzięki którym praktycznie już jesteś bogaty.