Podívejte se na všechny díly seriálu nebo na zdrojáky příkladu.
V předchozích dílech jsem si postavil nějakou tu základní strukturu aplikace, a dnes ji začnu rozbíjet.
Minule jsem přidal odkazy pro editaci a mazání tak, že jsem předstíral, že jsou to pole. To je samozřejmě ideově pochybené, proto to dnes uděláme pomocí šablony.
cd step05 python setup.py develop pserve --reload development.iniVpodstatě stačí formalchemy sdělit, kde má hledat naše lepší šablony. Je to v model/__init__.py ve funkci includeme. Není to ideální místo. Berte to trochu jako provizorium. Té konfigurace tam bude víc, a až bude, tak to uspořádám lépe. Každopádně, naše šablony budou v templates/formalchemy, a ze začátku jenom zkopírujeme ty z formalchemy/paster_templates/pylons_fa/+package+/templates/forms, ovšem přejmenujeme je na *.mako a ze začátku a konce odstraníme podmínku na mako. A budeme pracovat s grid_readonly.mako. Teď mrkněte na model/grids.py. Zrušil jsem field a renderer, a ty nesmysly s přidáváním vlastního pole, a jediné co chci je, aby ten můj grid dostal request. Budu ho potřebovat ke generování url z rout, a k lokalizaci. Teď už vás v grid_readonly.mako nemůže nic překvapit. To je v tomto kroku vše.
Jak jsem zmínil minule, funguje to s tím, že všechny modely mají primární klíč id. Teď už si vytvoříme novou databázi s tabulkou, ve které primární klíč nebude id, a dokonce bude složený ze dvou sloupců.
cd step06 python setup.py develop ..\..\scripts\initialize_faapp_db development.ini pserve --reload development.ini
Tento krok jsem vlastně udělal jenom kvůli tomu, abych se podíval, jak vlastně formalchemy staví ten formulář. Když tak mrkněte na výpis NonId a použijte třeba DOM inspector, abyste viděli, jaké DOM ID formalchemy používá. Nebude to pro nás asi důležité, ale je dobré to vědet.
Tady se konečně stane něco zajímavého. Předěláme routy tak, aby nepoužívaly natvrdo id, a uděláme si generování query parameters pro primární klíče.
cd step07 python setup.py develop pserve --reload development.iniV první řadě si všimněte v __init__.py těch rout. Už tam není id, a tím pádem už není rozdíl mezi edit a new. Pak v handlerech pro editaci a mazání views/view.py nepoužiju žádné request.matchdict[„id“], ale dělám _add_pk_q(…, model, request.params). A nakonec v šabloně templates/formalchemy/grid_readonly.mako pro generování url nepředávám id, ale _query, což je speciální parametr funkce route_url, který přidá query params.
Tak nejprve nějaké ty pomocné funkce. V model/meta.py najdete get_pk_columns, což je to nejdůležitější – najde nám jména sloupců s primárními klíči pro model/tabulku. Funkce pk vrátí pole dvojic (sloupec, hodnota) a get_pk_map je převede na mapu. Z ní se pak generují request parametry.
Teď obráceně – jak z request parametrů udělat podmínky pro where pro SQL dotaz. Tady si prostě vezmu seznam slupců – primárních klíčů, a hledám v request.params jejich hodnoty. Pokud najdu všechny, tak normálně sestavím SQL dotaz. Pokud mi některý chybí, tak je vyvolána vyjímka, a ta způsobí, že vytvořím nový objekt. Najdete to v views/view.py, funkci _add_pk_q. Můžete celkem oprávněně namítnout, že když někdo podvrhne url se špatnými parametry, tak místo toho, abych vyhodil chybu normálně vytvořím nový objekt. Přemýšlím, jestli to vadí, a řekl bych, že ne.
Podíváme se na Route Factories a uděláme nějaká drobná vylepšení.
Jmenuju se Petr Blahoš. Programuju něco přes 20 let. Tady se snažím psát hlavně o Pythonu, webovém frameworku Pyramid, a občas i o něčem úplně jiném.
Přečteno 19 226×
Přečteno 11 853×
Přečteno 9 346×
Přečteno 8 804×
Přečteno 8 594×