<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Django: nie róbcie tego w domu</title>
	<atom:link href="http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/feed/" rel="self" type="application/rss+xml" />
	<link>http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/</link>
	<description>Geek in the Shell: Redesigning the Web</description>
	<pubDate>Mon, 01 Dec 2008 19:19:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
		<item>
		<title>By: Brut[all]</title>
		<link>http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/#comment-7321</link>
		<dc:creator>Brut[all]</dc:creator>
		<pubDate>Sat, 24 Mar 2007 18:21:11 +0000</pubDate>
		<guid isPermaLink="false">http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/#comment-7321</guid>
		<description>Powiem szczerze, że dziwi mnie, czemu uważasz, że to taki straszny hack jest.
Właśnie dlatego w Django wszystko tu jest taki proste (generic views są najzwyklejszymi funkcjami, do których Django się najzwyczajniej odwołuje), aby można było z tym wyczyniać różne cuda.

Mnie się zdarzało już co najmniej parę razy nadpisywać działanie jakiegoś generic view poprzez napisanie własnej funkcji, która z tamtego korzystała.

Dajmy na to prosty przykład: chcemy mieć podstronę wyświetlającą informacje o jakimś obiekcie, ale tylko dla osób zalogowanych. Nie możemy skorzystać z django.views.generic.list_detail.object_detail, więc co, piszemy wszystko od początku? Nie, tworzymy funkcję, która nie robi nic innego, tylko wywołuje object_detail z tymi samymi parametrami, traktujemy ją dekoratorem login_required i już. Właściwie, to z naszej nowej funkcji możemy teraz korzystać jako z nowego generic view, wykorzystywać wszędzie, gdzie chcemy mieć object_detail tylko dla zalogowanych

(właściwie, to dla pojedyńczej sytuacji nawet nie trzeba tworzyć dodatkowej funkcji - w samym urls.py można od razu wstawić funkcję dekorującą z naszym object_detail jako parametr)

Podmienianie danych POST to już co innego - tu faktycznie stosujemy brzydki trik i przymus jego wykorzystania faktycznie jest spowodowany brakami w django.contrib.admin, ale jeśli chodzi o samo modyfikowanie widoku admina... to wydaje mi się jak najbardziej normalne.


Aha.
Jeśli mogę się przyczepić, to uważam, że jeszcze jedną rzecz mógłbyś zrobić dużo lepiej.
Normalna funkcja add_stage z admina przyjmuje w parametrach nazwę aplikacji i modelu. Ty, nadpisując ją, pozmieniałeś te parametry, co wydaje mi się zupełnie bez sensu - to chyba normalne, że jeśli coś dziedziczymy, czy nadpisujemy, to staramy się zostawić na wejściu i wyjściu dokładnie to samo?
Dużo lepiej by było, gdybyś zrobił tak:

return main.add_stage(request, *args, **kwargs)

Po prostu tak - standardowa zasada przy nadpisywaniu: "co przyszło, to wyjdzie", czyli wszystko załatwiają za nas świetne *args, **kwargs Pythona.
Oczywiście w takim razie i do nadpisującej funkcji muszą przyjść odpowiednie parametry. W takim razie modyfikujemy jeszcze urls.py:

(r'^admin/(aplikacja)/(model)/add/', 'serwis.aplikacja.admin_views.add_stage')

lub dodajemy nazwy 'aplikacja' i 'model' w słowniku w trzecim parametrze, choć to pierwsze rozwiązanie dużo lepsze.

Zyskujesz na tym:
1. Możliwość wykorzystania dokładnie tej samej modyfikacji dla innej aplikacji/modelu, gdybyś kiedyś chciał.
2. W cholerę i jeszcze trochę logiki, poprawności programistycznej, czy jakkolwiek tego jeszcze nie nazwiemy.</description>
		<content:encoded><![CDATA[<p>Powiem szczerze, że dziwi mnie, czemu uważasz, że to taki straszny hack jest.<br />
Właśnie dlatego w Django wszystko tu jest taki proste (generic views są najzwyklejszymi funkcjami, do których Django się najzwyczajniej odwołuje), aby można było z tym wyczyniać różne cuda.</p>
<p>Mnie się zdarzało już co najmniej parę razy nadpisywać działanie jakiegoś generic view poprzez napisanie własnej funkcji, która z tamtego korzystała.</p>
<p>Dajmy na to prosty przykład: chcemy mieć podstronę wyświetlającą informacje o jakimś obiekcie, ale tylko dla osób zalogowanych. Nie możemy skorzystać z django.views.generic.list_detail.object_detail, więc co, piszemy wszystko od początku? Nie, tworzymy funkcję, która nie robi nic innego, tylko wywołuje object_detail z tymi samymi parametrami, traktujemy ją dekoratorem login_required i już. Właściwie, to z naszej nowej funkcji możemy teraz korzystać jako z nowego generic view, wykorzystywać wszędzie, gdzie chcemy mieć object_detail tylko dla zalogowanych</p>
<p>(właściwie, to dla pojedyńczej sytuacji nawet nie trzeba tworzyć dodatkowej funkcji - w samym urls.py można od razu wstawić funkcję dekorującą z naszym object_detail jako parametr)</p>
<p>Podmienianie danych POST to już co innego - tu faktycznie stosujemy brzydki trik i przymus jego wykorzystania faktycznie jest spowodowany brakami w django.contrib.admin, ale jeśli chodzi o samo modyfikowanie widoku admina&#8230; to wydaje mi się jak najbardziej normalne.</p>
<p>Aha.<br />
Jeśli mogę się przyczepić, to uważam, że jeszcze jedną rzecz mógłbyś zrobić dużo lepiej.<br />
Normalna funkcja add_stage z admina przyjmuje w parametrach nazwę aplikacji i modelu. Ty, nadpisując ją, pozmieniałeś te parametry, co wydaje mi się zupełnie bez sensu - to chyba normalne, że jeśli coś dziedziczymy, czy nadpisujemy, to staramy się zostawić na wejściu i wyjściu dokładnie to samo?<br />
Dużo lepiej by było, gdybyś zrobił tak:</p>
<p>return main.add_stage(request, *args, **kwargs)</p>
<p>Po prostu tak - standardowa zasada przy nadpisywaniu: &#8220;co przyszło, to wyjdzie&#8221;, czyli wszystko załatwiają za nas świetne *args, **kwargs Pythona.<br />
Oczywiście w takim razie i do nadpisującej funkcji muszą przyjść odpowiednie parametry. W takim razie modyfikujemy jeszcze urls.py:</p>
<p>(r&#8217;^admin/(aplikacja)/(model)/add/&#8217;, &#8217;serwis.aplikacja.admin_views.add_stage&#8217;)</p>
<p>lub dodajemy nazwy &#8216;aplikacja&#8217; i &#8216;model&#8217; w słowniku w trzecim parametrze, choć to pierwsze rozwiązanie dużo lepsze.</p>
<p>Zyskujesz na tym:<br />
1. Możliwość wykorzystania dokładnie tej samej modyfikacji dla innej aplikacji/modelu, gdybyś kiedyś chciał.<br />
2. W cholerę i jeszcze trochę logiki, poprawności programistycznej, czy jakkolwiek tego jeszcze nie nazwiemy.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cezio</title>
		<link>http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/#comment-6784</link>
		<dc:creator>cezio</dc:creator>
		<pubDate>Fri, 23 Feb 2007 14:27:38 +0000</pubDate>
		<guid isPermaLink="false">http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/#comment-6784</guid>
		<description>a propos hackowania django.contrib.admin, a w szczególności model.User, to jest też ciekawa lektura na http://www.b-list.org/weblog/2007/02/20/about-model-subclassing</description>
		<content:encoded><![CDATA[<p>a propos hackowania django.contrib.admin, a w szczególności model.User, to jest też ciekawa lektura na <a href="http://www.b-list.org/weblog/2007/02/20/about-model-subclassing" rel="nofollow">http://www.b-list.org/weblog/2007/02/20/about-model-subclassing</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>

<!-- Dynamic Page Served (once) in 2.617 seconds -->
