<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2110918563749668217</id><updated>2012-03-16T05:25:46.505+02:00</updated><category term='Python'/><category term='AdminSite'/><category term='jQuery'/><category term='Book'/><category term='javascript'/><category term='template'/><category term='Django'/><category term='ExtJs'/><category term='ORM'/><title type='text'>Заметочки</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alerion.pp.ua/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-3659385566624096375</id><published>2010-07-23T18:45:00.000+03:00</published><updated>2010-07-23T18:45:14.661+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python datetime to javascript Date</title><content type='html'>В Django есть DjangoJSONEncoder, который используется при конвертировании данных в json-формат. Он форматирует дату в строку. Пришлось написать свой енкодер, что бы на клиенте получать обьект Date, а не строку.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8134/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8134/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.utils &lt;span style="color: blue;"&gt;import&lt;/span&gt; simplejson&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;DatetimeJSONEncoder&lt;/span&gt;(simplejson.JSONEncoder):&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;DateInt&lt;/span&gt;(int):&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Наследуемся&amp;nbsp;от&amp;nbsp;int,&amp;nbsp;потому&amp;nbsp;что&amp;nbsp;тогда&amp;nbsp;значение&amp;nbsp;будет&amp;nbsp;без&amp;nbsp;"".&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;В&amp;nbsp;других&amp;nbsp;случаях&amp;nbsp;получим:&amp;nbsp;"new&amp;nbsp;Date(100500)"&amp;nbsp;и&amp;nbsp;при&amp;nbsp;eval&amp;nbsp;будет&amp;nbsp;просто&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;строка.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def __str__&lt;/span&gt;(self):&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: green;"&gt;'new&amp;nbsp;Date(%s)'&lt;/span&gt; % (self*&lt;span style="color: green;"&gt;1000&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;default&lt;/span&gt;(self, o):&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.utils &lt;span style="color: blue;"&gt;import&lt;/span&gt; datetime_safe&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; datetime &lt;span style="color: blue;"&gt;import&lt;/span&gt; datetime&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;import&lt;/span&gt; time&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; &lt;b&gt;isinstance&lt;/b&gt;(o, datetime):&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = datetime_safe.new_datetime(o)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;b&gt;self&lt;/b&gt;.&lt;span style="color: #cc6633;"&gt;DateInt&lt;/span&gt;(&lt;b&gt;int&lt;/b&gt;(&lt;b&gt;time&lt;/b&gt;.mktime(d.timetuple())))&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;:&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;b&gt;super&lt;/b&gt;(&lt;span style="color: #cc6633;"&gt;DatetimeJSONEncoder&lt;/span&gt;, self).&lt;span style="color: #cc6633;"&gt;default&lt;/span&gt;(o)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color: dimgrey;"&gt;#example&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; datetime &lt;span style="color: blue;"&gt;import&lt;/span&gt; datetime&lt;/li&gt; &lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.utils &lt;span style="color: blue;"&gt;import&lt;/span&gt; simplejson&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;data = &lt;b&gt;dict&lt;/b&gt;(date=&lt;b&gt;datetime&lt;/b&gt;.now())&lt;/li&gt; &lt;li&gt;json = simplejson.dumps(data, cls=DjangoJSONEncoder) &lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-3659385566624096375?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/3659385566624096375/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2010/07/python-datetime-to-javascript-date.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/3659385566624096375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/3659385566624096375'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2010/07/python-datetime-to-javascript-date.html' title='Python datetime to javascript Date'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-1109690269784997208</id><published>2010-07-21T18:30:00.002+03:00</published><updated>2010-07-21T18:34:39.330+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Ковертируем текст из файла в utf8</title><content type='html'>Понадобилось читать из файлов субтитры, парсить и складывать в БД. Как всегда проблемы с кодировкой. Гугл подсказал вот такой вот модуль: &lt;a href="http://pypi.python.org/pypi/chardet"&gt;сhardet.&lt;/a&gt; &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8114/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8114/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;import&lt;/span&gt; chardet&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;text = subtitles.read()&lt;/li&gt;&lt;li&gt;text = &lt;b&gt;unicode&lt;/b&gt;(text, chardet.detect(text)[&lt;span style="color: green;"&gt;'encoding'&lt;/span&gt;])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-1109690269784997208?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/1109690269784997208/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2010/07/utf8.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/1109690269784997208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/1109690269784997208'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2010/07/utf8.html' title='Ковертируем текст из файла в utf8'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-5852280067500213771</id><published>2010-07-20T19:10:00.002+03:00</published><updated>2010-07-20T19:18:38.315+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Подгрузка связанных моделей, ч.2</title><content type='html'>Собственно пылятся еще две функции, неизвестной полезности, для подгрузки связаных моделей: для GenericForeignKey и ForeignKey(null=True). Работало на Django 1.1. Думаю с небольшим "допилом" будет и на 1.2 работать. Все это делалось для комментариев. Первой ф-цией подгружали комментируемые обьекты, а второй - пользователей, которые комментировали.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8095/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8095/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;load_related_generic&lt;/span&gt;(object_list, field=&lt;span style="color: green;"&gt;'content_object'&lt;/span&gt;):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if not&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; object_list&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_field = &lt;b&gt;getattr&lt;/b&gt;(object_list.model, field)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ct_field = object_list.model._meta.get_field(related_field.ct_field).get_attname()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fk_field = object_list.model._meta.get_field(related_field.fk_field).get_attname()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = {}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to_retrive = {}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ct_id = &lt;b&gt;getattr&lt;/b&gt;(item, ct_field)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fk_id = &lt;b&gt;getattr&lt;/b&gt;(item, fk_field)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; ct_id &lt;span style="color: blue;"&gt;not in&lt;/span&gt; to_retrive:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to_retrive[ct_id] = {&lt;span style="color: green;"&gt;'model'&lt;/span&gt;: &lt;b&gt;getattr&lt;/b&gt;(item, related_field.ct_field).model_class(), &lt;span style="color: green;"&gt;'pks'&lt;/span&gt;: &lt;b&gt;set&lt;/b&gt;([])}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to_retrive[ct_id][&lt;span style="color: green;"&gt;'pks'&lt;/span&gt;].update([fk_id])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; key &lt;span style="color: blue;"&gt;in&lt;/span&gt; to_retrive:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objects = to_retrive[key][&lt;span style="color: green;"&gt;'model'&lt;/span&gt;]._default_manager.&lt;b&gt;filter&lt;/b&gt;(pk__in=&lt;b&gt;list&lt;/b&gt;(to_retrive[key][&lt;span style="color: green;"&gt;'pks'&lt;/span&gt;]))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result[key] = &lt;b&gt;dict&lt;/b&gt;([[obj.pk, obj] &lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; objects])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;setattr&lt;/b&gt;(item, field, result[&lt;b&gt;getattr&lt;/b&gt;(item, ct_field)][&lt;b&gt;int&lt;/b&gt;(&lt;b&gt;getattr&lt;/b&gt;(item, fk_field))])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;load_related_fk&lt;/span&gt;(object_list, field):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if not&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; object_list&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_field = object_list.model._meta.get_field(field)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attname = related_field.get_attname()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pks = &lt;b&gt;list&lt;/b&gt;(&lt;b&gt;set&lt;/b&gt;([&lt;b&gt;getattr&lt;/b&gt;(obj, attname) &lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list &lt;span style="color: blue;"&gt;if&lt;/span&gt; &lt;b&gt;getattr&lt;/b&gt;(obj, attname)]))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objects = related_field.rel.to._default_manager.&lt;b&gt;filter&lt;/b&gt;(pk__in=pks)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_dict = {}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; objects:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_dict[obj.pk] = obj&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;setattr&lt;/b&gt;(obj, field, related_dict[&lt;b&gt;getattr&lt;/b&gt;(obj, attname)])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;except&lt;/span&gt; KeyError:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;pass&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; object_list &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8096/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8096/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: dimgrey;"&gt;#views.py&lt;/span&gt;&lt;/li&gt;&lt;li&gt;comments = Comment.objects.&lt;b&gt;all&lt;/b&gt;()&lt;/li&gt;&lt;li&gt;load_related_generic(comments)&lt;/li&gt;&lt;li&gt;load_related_fk(comments, &lt;span style="color: green;"&gt;'user'&lt;/span&gt;) &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8097/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8097/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;{% for item in comments %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{ item.user.username|default: item.username }} &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt; &lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="{{ item.content_object.get_absolute_url }}"&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{ item.content_object.name }}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{ item.comment|striptags|truncatewords:10 }}&lt;/li&gt;&lt;li&gt;{% endfor %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://alerion.pp.ua/2009/08/blog-post_28.html"&gt;Собственно для подгрузки m2m&lt;/a&gt;. &lt;a href="http://larin.in/archives/193"&gt;И то же для Django 1.2 от Анатолия Ларина.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-5852280067500213771?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/5852280067500213771/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2010/07/2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/5852280067500213771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/5852280067500213771'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2010/07/2.html' title='Подгрузка связанных моделей, ч.2'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-479002267997333786</id><published>2010-04-29T10:04:00.004+03:00</published><updated>2010-07-20T19:19:36.386+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExtJs'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Ошибки валидации для ExtJs</title><content type='html'>Добавляем небольшую функцию для отображения ошибок в формах ExtJs. Названия полей Django-форма и ExtJs-должны совпадать, ну или переформатировать словарь ошибок. Такой же прием использовал и для jQuery.ajaxForm, только ошибки "врукопашную" отображал.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8093/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8093/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;ExtJsForm&lt;/span&gt;(object)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;get_errors&lt;/span&gt;(self):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.utils.encoding &lt;span style="color: blue;"&gt;import&lt;/span&gt; force_unicode        &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = {}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; key, value &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;b&gt;self&lt;/b&gt;.errors.items():&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output[key] = &lt;span style="color: green;"&gt;'/n'&lt;/span&gt;.join([force_unicode(i) &lt;span style="color: blue;"&gt;for&lt;/span&gt; i &lt;span style="color: blue;"&gt;in&lt;/span&gt; value])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; output&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;ContactForm&lt;/span&gt;(forms.Form, &lt;span style="color: #cc6633;"&gt;ExtJsForm&lt;/span&gt;):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subject = forms.CharField(max_length=&lt;span style="color: green;"&gt;100&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message = forms.CharField()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sender = forms.EmailField()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;save&lt;/span&gt;(self):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;pass&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: dimgrey;"&gt;#views.py&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;post&lt;/span&gt;(request):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;form = &lt;span style="color: #cc6633;"&gt;ContactForm&lt;/span&gt;(request.POST)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; form.is_valid():&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;form.&lt;span style="color: #cc6633;"&gt;save&lt;/span&gt;()    &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;b&gt;dict&lt;/b&gt;(success=True)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;b&gt;dict&lt;/b&gt;(success=False, errors=form.&lt;span style="color: #cc6633;"&gt;get_errors&lt;/span&gt;()) &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/8094/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/8094/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: green;"&gt;//Пример&amp;nbsp;отображения&amp;nbsp;ошибок&amp;nbsp;с&amp;nbsp;jQuery.ajaxForm&lt;/span&gt;&lt;/li&gt;&lt;li&gt;$(&lt;span style="color: #a31515;"&gt;'#form'&lt;/span&gt;).ajaxForm({&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataType: &lt;span style="color: #a31515;"&gt;'json'&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success: &lt;span style="color: blue;"&gt;function&lt;/span&gt;(data, status, xhr, $form){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (data.success){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$form.resetForm();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: blue;"&gt;else&lt;/span&gt; {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; (key &lt;span style="color: blue;"&gt;in&lt;/span&gt; data.errors){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; $field = $(&lt;span style="color: #a31515;"&gt;'input[name="'&lt;/span&gt;+key+&lt;span style="color: #a31515;"&gt;'"]'&lt;/span&gt;, $form);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt; error = &lt;span style="color: #a31515;"&gt;'&amp;lt;p&amp;nbsp;class="error_list"&amp;gt;'&lt;/span&gt;+data.errors[key]+&lt;span style="color: #a31515;"&gt;'&amp;lt;/p&amp;gt;'&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; ($field.length){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//показываем&amp;nbsp;ошибки&amp;nbsp;валидации&amp;nbsp;над&amp;nbsp;каждым&amp;nbsp;полем&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: #a31515;"&gt;'input[name="'&lt;/span&gt;+key+&lt;span style="color: #a31515;"&gt;'"]'&lt;/span&gt;, $form).before(error);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style="color: blue;"&gt;else&lt;/span&gt;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//показываем&amp;nbsp;глобальные&amp;nbsp;ошибки,&amp;nbsp;те&amp;nbsp;которые&amp;nbsp;__all__&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$form.prepend(error);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;beforeSubmit: &lt;span style="color: blue;"&gt;function&lt;/span&gt;(formData, $Form, options){&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(&lt;span style="color: #a31515;"&gt;'p.error_list'&lt;/span&gt;, $Form).remove();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}); &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-479002267997333786?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/479002267997333786/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2010/04/show-forms-errors-for-extjs.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/479002267997333786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/479002267997333786'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2010/04/show-forms-errors-for-extjs.html' title='Ошибки валидации для ExtJs'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-1557884631214550679</id><published>2010-03-26T18:48:00.003+02:00</published><updated>2010-07-20T19:20:40.473+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='template'/><title type='text'>Устанавливаем значение в context навсегда</title><content type='html'>&lt;a href="http://django-newbie.blogspot.com/2010/03/blog-post_20.html"&gt;Собственно что натолкнуло&lt;/a&gt;&lt;br /&gt;Самого удивило что значение установленное из Node в context сохраняется в пределах одного блока.&lt;br /&gt;&lt;br /&gt;{% extends 'test/base.html' %}&lt;br /&gt;&lt;br /&gt;{% load foo %}&lt;br /&gt;&lt;br /&gt;{% block content %}&lt;br /&gt;{% set_bar_value %}&lt;br /&gt;{{ bar_value }} == 'BAR'&lt;br /&gt;{% endblock %}&lt;br /&gt;&lt;br /&gt;{% block menu %}&lt;br /&gt;{{ bar_value }} == ''&lt;br /&gt;{% endblock %}&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Залез в код, оказалось что значение устанавливается в словарь, который после выхода из блока удаляется. Как-то вот так:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6263/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6263/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;BlockNode&lt;/span&gt;(Node):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#....&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;render&lt;/span&gt;(self, context):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.push()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#&amp;nbsp;Save&amp;nbsp;context&amp;nbsp;in&amp;nbsp;case&amp;nbsp;of&amp;nbsp;block.super().&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;self&lt;/b&gt;.context = context&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context[&lt;span style="color: green;"&gt;'block'&lt;/span&gt;] = self&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = &lt;b&gt;self&lt;/b&gt;.nodelist.&lt;span style="color: #cc6633;"&gt;render&lt;/span&gt;(context)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.pop()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; result &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Собственно вставляем свой словарик с нужным значением и значение попадет в глобальный контекст.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/6264/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/6264/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;BarNode&lt;/span&gt;(template.Node):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def __init__&lt;/span&gt;(self, name):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;self&lt;/b&gt;.name = name&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;get_value&lt;/span&gt;(self):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: green;"&gt;'BAR'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;render&lt;/span&gt;(self, context):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = context.pop()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.update({&lt;b&gt;self&lt;/b&gt;.name: &lt;b&gt;self&lt;/b&gt;.&lt;span style="color: #cc6633;"&gt;get_value&lt;/span&gt;()})&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.update(d)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: green;"&gt;''&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-1557884631214550679?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/1557884631214550679/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2010/03/context.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/1557884631214550679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/1557884631214550679'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2010/03/context.html' title='Устанавливаем значение в context навсегда'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-2775277117476621319</id><published>2009-08-28T18:06:00.002+03:00</published><updated>2010-07-20T19:21:33.579+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AdminSite'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Без права редактирования</title><content type='html'>Опять же постил на &lt;a href="http://djbook.ru/text/admin_no_edit/"&gt;djbook.ru&lt;/a&gt;.&lt;br /&gt;Есть модель комментариев. Нужен интерфейс в админке для их модерирования. Модератор может только удалять комментарии, во избежания казусов "я такого не писал". Нужно убрать права на изменение записи и убрать все ссылки на страницу редактирования комментария.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;#models.py&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2943/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2943/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Comment&lt;/span&gt;(BaseComment):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content_type   = models.ForeignKey(ContentType, related_name=&lt;span style="color: #a31515;"&gt;"content_type_set_for_%(class)s"&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object_id      = models.TextField(&lt;span style="color: #a31515;"&gt;'object&amp;nbsp;ID'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content_object = generic.GenericForeignKey(ct_field=&lt;span style="color: #a31515;"&gt;"content_type"&lt;/span&gt;, fk_field=&lt;span style="color: #a31515;"&gt;"object_id"&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content_object.short_description = u&lt;span style="color: #a31515;"&gt;'Статья'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user        = models.ForeignKey(User, related_name=&lt;span style="color: #a31515;"&gt;'%(class)s_comments'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment     = models.TextField(&lt;span style="color: #a31515;"&gt;'Комментарий'&lt;/span&gt;, max_length=COMMENT_MAX_LENGTH)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip          = models.IPAddressField(&lt;span style="color: #a31515;"&gt;'IP'&lt;/span&gt;, editable=False)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;created_at  = models.DateTimeField(&lt;span style="color: #a31515;"&gt;'Добавлен'&lt;/span&gt;, auto_now_add=True)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Meta&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;verbose_name&lt;/span&gt; = &lt;span style="color: #a31515;"&gt;'комментарий'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verbose_name_plural = &lt;span style="color: #a31515;"&gt;'комментарии'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def get_category(self):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Возвращаем&amp;nbsp;читабельное&amp;nbsp;название&amp;nbsp;раздела&amp;nbsp;к&amp;nbsp;которому&amp;nbsp;принадлежит&amp;nbsp;комментарий&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parts = {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;'news'&lt;/span&gt;: u&lt;span style="color: #a31515;"&gt;'Новости'&lt;/span&gt;,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;'cinema'&lt;/span&gt;: u&lt;span style="color: #a31515;"&gt;'Киноафиша'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; parts[self.content_type.app_label]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get_category.short_description = u&lt;span style="color: #a31515;"&gt;'Раздел'&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;#admin.py&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2944/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2944/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; CommentAdmin(&lt;span style="color: blue;"&gt;admin&lt;/span&gt;.ModelAdmin):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list_display = (&lt;span style="color: #a31515;"&gt;'user'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'comment'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'get_category'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'content_object'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'ip'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'created_at'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list_select_related = &lt;span style="color: blue;"&gt;True&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;search_fields = (&lt;span style="color: #a31515;"&gt;'comment'&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;'user__username'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordering = (&lt;span style="color: #a31515;"&gt;'-created_at'&lt;/span&gt;,)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def has_change_permission(self, request, obj=&lt;span style="color: blue;"&gt;None&lt;/span&gt;):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Если&amp;nbsp;просто&amp;nbsp;возвращать&amp;nbsp;False,&amp;nbsp;django&amp;nbsp;даже&amp;nbsp;не&amp;nbsp;пусть&amp;nbsp;на&amp;nbsp;страницу&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;списка&amp;nbsp;объектов,&amp;nbsp;которая&amp;nbsp;нам&amp;nbsp;и&amp;nbsp;нужна.&amp;nbsp;Если&amp;nbsp;obj&amp;nbsp;не&amp;nbsp;равно&amp;nbsp;None,&amp;nbsp;значит&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;пользователь&amp;nbsp;пытается&amp;nbsp;зайти&amp;nbsp;на&amp;nbsp;страницу&amp;nbsp;редактирования,&amp;nbsp;иначе&amp;nbsp;-&amp;nbsp;страницу&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;списка&amp;nbsp;комменатариев.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; obj:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return False&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; super(CommentAdmin, self).has_change_permission(request, obj=&lt;span style="color: blue;"&gt;None&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def has_add_permission(self, request):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Запрещаем добавление комментариев через админский интерфейс&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return False&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def changelist_view(self, request, extra_context=&lt;span style="color: blue;"&gt;None&lt;/span&gt;):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Этот&amp;nbsp;метод&amp;nbsp;возращает&amp;nbsp;таблицу&amp;nbsp;комментариев.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Вот&amp;nbsp;здесь&amp;nbsp;мы&amp;nbsp;убираем&amp;nbsp;ссылку&amp;nbsp;на&amp;nbsp;редактирование&amp;nbsp;комментария&amp;nbsp;на&amp;nbsp;странице&amp;nbsp;списка&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;комментариев.&amp;nbsp;В&amp;nbsp;__init__&amp;nbsp;не&amp;nbsp;получается,&amp;nbsp;потому&amp;nbsp;где-то&amp;nbsp;после&amp;nbsp;него&amp;nbsp;ставится&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;первая&amp;nbsp;колонка&amp;nbsp;по&amp;nbsp;дефолту.&amp;nbsp;(None,)&amp;nbsp;потому&amp;nbsp;что&amp;nbsp;если&amp;nbsp;передать&amp;nbsp;пустой&amp;nbsp;список,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;в&amp;nbsp;теге&amp;nbsp;шаблона&amp;nbsp;ссылка&amp;nbsp;добавится&amp;nbsp;на&amp;nbsp;checkbox.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'''&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.list_display_links = (&lt;span style="color: blue;"&gt;None&lt;/span&gt;,)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; super(CommentAdmin, self).changelist_view(request, extra_context=&lt;span style="color: blue;"&gt;None&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-2775277117476621319?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/2775277117476621319/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post_9458.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/2775277117476621319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/2775277117476621319'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post_9458.html' title='Без права редактирования'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-3490412296905959535</id><published>2009-08-28T17:59:00.004+03:00</published><updated>2010-07-20T19:40:47.745+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Подгрузка связанных моделей (многие-ко-многим)</title><content type='html'>Постил когда-то на &lt;a href="http://djbook.ru/text/load_related_m2m/"&gt;djbook.ru&lt;/a&gt; решил и сюда добавить. &lt;br /&gt;Select_related не работает для обратных связей. В мануале Django, в примере, используется обычный менеджер для обратных связаных таблиц, который посылает запрос при обращении к ним. Можно, конечно, использовать raw sql, когда нет доступа к методам моделей, например, get_absolute_url и др. Функция load_related_m2m для обьектов в object_list получает все связаные(m2m) через поле field обьекты и заносит в поле "all_" % field обьекта. В результате получаем всего один лишний запрос на каждую связаную таблицу.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://larin.in/archives/193"&gt;Вот здесь&lt;/a&gt; Анатолий Ларин запостил версию для Django 1.2.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;#models.py&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2942/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2942/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Post(models.Model):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = models.CharField(max_length=255)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tags = models.ManyToManyField(&lt;span style="color: #a31515;"&gt;'Tag'&lt;/span&gt;, blank=&lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;genres = models.ManyToManyField(&lt;span style="color: #a31515;"&gt;'Genre'&lt;/span&gt;, blank=&lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Tag(models.Model):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = models.CharField(max_length=255, &lt;span style="color: blue;"&gt;unique&lt;/span&gt;=&lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; Genre(models.Model):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = models.CharField(max_length=255, &lt;span style="color: blue;"&gt;unique&lt;/span&gt;=&lt;span style="color: blue;"&gt;True&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;#&lt;code&gt;views.py&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2939/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2939/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;def test(request):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; lib import load_related_m2m&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; app.models import Post&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = Post.objects.all()[:&lt;span style="color: #a31515;"&gt;10&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;load_related_m2m(p, &lt;span style="color: #a31515;"&gt;'tags'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;load_related_m2m(p, &lt;span style="color: #a31515;"&gt;'genres'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; {&lt;span style="color: #a31515;"&gt;'posts'&lt;/span&gt;: p}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;code&gt;#&lt;/code&gt;&lt;code&gt;test.html&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2940/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2940/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;{% for item in posts %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h3&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;{{ item.name }}&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h3&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Теги:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{% for tag in item.all_tags %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{ tag.name }}, &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{% endfor %}&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Жанры:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{% for g in item.all_genres %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{ g.name }},&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{% endfor %}&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;{% endfor %} &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;code&gt;#lib.py&lt;/code&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2941/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2941/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.db.models.sql.constants import LOOKUP_SEP&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.db.models import sql&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.db import connection&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;def load_related_m2m(object_list, field):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select_fields = [&lt;span style="color: #a31515;"&gt;'pk'&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_field = object_list.model._meta.get_field(field)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_model = related_field.rel.to&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache_name = &lt;span style="color: #a31515;"&gt;'all_%s'&lt;/span&gt; % field&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; f &lt;span style="color: blue;"&gt;in&lt;/span&gt; related_model._meta.local_fields:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select_fields.append(&lt;span style="color: #a31515;"&gt;'%s%s%s'&lt;/span&gt; % (field, LOOKUP_SEP, f.column))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query = sql.Query(object_list.model, connection)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query.add_fields(select_fields)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query.add_filter((&lt;span style="color: #a31515;"&gt;'pk__in'&lt;/span&gt;, [obj.pk &lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list]))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_dict = {}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; row &lt;span style="color: blue;"&gt;in&lt;/span&gt; query.results_iter():&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; row[&lt;span style="color: #a31515;"&gt;2&lt;/span&gt;]:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;related_dict.setdefault(row[&lt;span style="color: #a31515;"&gt;&amp;nbsp;0&lt;/span&gt;], []).append(related_model(*row[&lt;span style="color: #a31515;"&gt;1&lt;/span&gt;:]))&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt; obj &lt;span style="color: blue;"&gt;in&lt;/span&gt; object_list:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setattr(obj, cache_name, related_dict[obj.pk])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except KeyError:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setattr(obj, cache_name, [])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; object_list&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-3490412296905959535?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/3490412296905959535/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post_28.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/3490412296905959535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/3490412296905959535'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post_28.html' title='Подгрузка связанных моделей (многие-ко-многим)'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-7765594537967066586</id><published>2009-08-27T12:22:00.000+03:00</published><updated>2009-08-28T12:23:11.491+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Book'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Pro Django</title><content type='html'>Скачал замечательнейшую книгу по Django. Нет никаких описаний типов переменных, операторов и других основ Python, а сразу про метапрограммирование и его приминение в Django. Правда многое уже изучено по исходникам Django :) &lt;br /&gt;http://www.ebookslab.info/pro-django.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-7765594537967066586?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/7765594537967066586/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2009/08/pro-django.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/7765594537967066586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/7765594537967066586'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2009/08/pro-django.html' title='Pro Django'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2110918563749668217.post-7255625590973844148</id><published>2009-08-22T15:46:00.002+03:00</published><updated>2010-07-20T19:41:10.908+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>"У нас профилактика."</title><content type='html'>Когда обновляешь что-то на сервере, не всегда уверен что всё будет сразу работать(про тестирование, и автоматическое обновление можно и не мечтать). Показывать 500, пока правишь какую-то мелочь, про которую забыл не очень хочется. По-этому нужно закрыть доступ на время страницей "Мы обновляемся". Решил подменять ответ Handler-а Django(в нашем случае &lt;b&gt;WSGIHandler&lt;/b&gt;) на эту самую страницу, если &lt;b&gt;REMOTE_ADDR &lt;/b&gt;не входит в &lt;b&gt;INTERNAL_IPS&lt;/b&gt;(мне то нужно обновить и проверить всё ли работает).Создаём два скрипта один из которых и будет подменять ответ. В настройках хостинга в AddHandler прописываем путь к симлинку на один из скриптов, симлинк будем менять консольной командой, например: &lt;i&gt;python manage.py site off&lt;/i&gt;. Командой - &lt;i&gt;python manage.py site on - &lt;/i&gt;логично&lt;i&gt;, &lt;/i&gt;будем возвращать сайт на место.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Собственно наша команда, располагаем её в модуле любого установленого нами приложения в &lt;b&gt;INSTALLED_APPS&lt;/b&gt;, в &lt;i&gt;management/commands/syte.py&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2907/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2907/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: dimgrey;"&gt;#&amp;nbsp;-*-&amp;nbsp;coding:&amp;nbsp;utf-8&amp;nbsp;-*-&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.core.management.base &lt;span style="color: blue;"&gt;import&lt;/span&gt; BaseCommand, CommandError&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.conf &lt;span style="color: blue;"&gt;import&lt;/span&gt; settings&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;import&lt;/span&gt; os&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;Command&lt;/span&gt;(BaseCommand):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;help = &lt;span style="color: green;"&gt;"Закрывает&amp;nbsp;или&amp;nbsp;открывает&amp;nbsp;доступ&amp;nbsp;на&amp;nbsp;сайт."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args = &lt;span style="color: green;"&gt;'[on&amp;nbsp;or&amp;nbsp;off]'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;templates = {&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;'on'&lt;/span&gt;: &lt;span style="color: green;"&gt;'django_on.wsgi'&lt;/span&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: dimgrey;"&gt;#wsgi-скрипт&amp;nbsp;в&amp;nbsp;режиме&amp;nbsp;ON&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;'off'&lt;/span&gt;: &lt;span style="color: green;"&gt;'django_off.wsgi'&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: dimgrey;"&gt;#wsgi-скрипт&amp;nbsp;в&amp;nbsp;режиме&amp;nbsp;OFF&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;handle&lt;/span&gt;(self, flag, *args, **options):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; flag &lt;span style="color: blue;"&gt;not in&lt;/span&gt; &lt;b&gt;self&lt;/b&gt;.templates:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;raise&lt;/span&gt; CommandError(&lt;span style="color: green;"&gt;'Неизвестный&amp;nbsp;параметр:&amp;nbsp;%s'&lt;/span&gt; % flag)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path = settings.PROJECT_ROOT&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;os&lt;/b&gt;.chdir(path)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#удаляем&amp;nbsp;существующий&amp;nbsp;симлинк&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;try&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;os&lt;/b&gt;.remove(&lt;span style="color: green;"&gt;'django.wsgi'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;except&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;pass&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#устанавливаем&amp;nbsp;новый&amp;nbsp;симлинк&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;os&lt;/b&gt;.symlink(&lt;b&gt;self&lt;/b&gt;.templates[flag], &lt;span style="color: green;"&gt;'django.wsgi'&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; flag == &lt;span style="color: green;"&gt;'off'&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;print&lt;/span&gt; &lt;span style="color: green;"&gt;'Сайт&amp;nbsp;остановлен.&amp;nbsp;Перезапустите&amp;nbsp;сервер.'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; flag == &lt;span style="color: green;"&gt;'on'&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;print&lt;/span&gt; &lt;span style="color: green;"&gt;'Сайт&amp;nbsp;запущен.&amp;nbsp;Перезапустите&amp;nbsp;сервер.'&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;django_off.wsgi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;small&gt;&lt;a href="http://s-c.me/2908/s"&gt;Copy&amp;nbsp;Source&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://s-c.me/2908/h"&gt;Copy&amp;nbsp;HTML&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;import&lt;/span&gt; sys&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;import&lt;/span&gt; os&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;import&lt;/span&gt; &lt;b&gt;os&lt;/b&gt;.path&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;def&lt;/span&gt; &lt;span style="color: #cc6633;"&gt;app&lt;/span&gt;(environ, start_response):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path = &lt;b&gt;os&lt;/b&gt;.path.dirname(__file__)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;sys&lt;/b&gt;.path.insert(&lt;span style="color: green;"&gt;&amp;nbsp;0&lt;/span&gt;, path)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;import&lt;/span&gt; settings&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#проверяем&amp;nbsp;наличие&amp;nbsp;REMOTE_ADDR&amp;nbsp;среди&amp;nbsp;дозволеных&amp;nbsp;IP&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt; environ[&lt;span style="color: green;"&gt;'REMOTE_ADDR'&lt;/span&gt;] &lt;span style="color: blue;"&gt;in&lt;/span&gt; settings.INTERNAL_IPS:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;from&lt;/span&gt; django.core.handlers.wsgi &lt;span style="color: blue;"&gt;import&lt;/span&gt; WSGIHandler&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;os&lt;/b&gt;.environ[&lt;span style="color: green;"&gt;'DJANGO_SETTINGS_MODULE'&lt;/span&gt;] = &lt;span style="color: green;"&gt;'settings'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handler = WSGIHandler()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; handler(environ, start_response)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: dimgrey;"&gt;#возвращаем&amp;nbsp;"страницу&amp;nbsp;профилактики",&amp;nbsp;которая&amp;nbsp;леит&amp;nbsp;в&amp;nbsp;корне&amp;nbsp;проекта&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_response(&lt;span style="color: green;"&gt;'200&amp;nbsp;OK'&lt;/span&gt;, [(&lt;span style="color: green;"&gt;'Content-type'&lt;/span&gt;, &lt;span style="color: green;"&gt;'text/html'&lt;/span&gt;)])&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;b&gt;open&lt;/b&gt;(path+&lt;span style="color: green;"&gt;'/off_template.html'&lt;/span&gt;).read()&lt;/li&gt;&lt;li&gt;application = &lt;span style="color: #cc6633;"&gt;app&lt;/span&gt; &lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="color: black; font-family: Consolas,Courier New,Courier,Monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2110918563749668217-7255625590973844148?l=alerion.pp.ua' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alerion.pp.ua/feeds/7255625590973844148/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/7255625590973844148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2110918563749668217/posts/default/7255625590973844148'/><link rel='alternate' type='text/html' href='http://alerion.pp.ua/2009/08/blog-post.html' title='&quot;У нас профилактика.&quot;'/><author><name>alerion</name><uri>http://www.blogger.com/profile/17928571304081754995</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_N24YJTq8rHw/TER6_7k6VxI/AAAAAAAAAFo/_Wk7QfY670w/S220/x_56707440.jpg'/></author><thr:total>2</thr:total></entry></feed>
