<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF107%3ADjango</id>
		<title>LXF107:Django - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF107%3ADjango"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;action=history"/>
		<updated>2026-05-13T08:46:27Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8629&amp;oldid=prev</id>
		<title>Shultais: Добавлена ссылка на сайт автора</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8629&amp;oldid=prev"/>
				<updated>2009-08-31T14:50:52Z</updated>
		
		<summary type="html">&lt;p&gt;Добавлена ссылка на сайт автора&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 14:50, 31 августа 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/Django}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/Django}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== В гостях хорошо, а дома лучше ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== В гостях хорошо, а дома лучше ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: ''ЧАСТЬ 3 В мире существуют языки, отличные от английского, и компьютеры попроще IBM Roadrunner. '''Никита Шультайс''' покажет, как Django справляется и с тем, и с другим.''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: ''ЧАСТЬ 3 В мире существуют языки, отличные от английского, и компьютеры попроще IBM Roadrunner. '''Никита Шультайс''' &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;(http://shultais.ru) &lt;/ins&gt;покажет, как Django справляется и с тем, и с другим.''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До сих пор мы созерцали «админку» на английском языке,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До сих пор мы созерцали «админку» на английском языке,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Shultais</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8135&amp;oldid=prev</id>
		<title>Yaleks в 16:46, 21 июня 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8135&amp;oldid=prev"/>
				<updated>2009-06-21T16:46:24Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 16:46, 21 июня 2009&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 4:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 4:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До сих пор мы созерцали «админку» на английском языке,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;До сих пор мы созерцали «админку» на английском языке,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;однако ее русификация – тоже не проблема. Для этого &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;нуж-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;однако ее русификация – тоже не проблема. Для этого &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;нужно &lt;/ins&gt;всего лишь добавить в кортеж MIDDLEWARE_CLASSES в&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;но &lt;/del&gt;всего лишь добавить в кортеж MIDDLEWARE_CLASSES в&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;файле settings.py следующую строку:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;файле settings.py следующую строку:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; 'django.middleware.locale.LocaleMiddleware',&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; 'django.middleware.locale.LocaleMiddleware',&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 28:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Что переводить? ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Что переводить? ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Заголовок=Вниманию полиглотов&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Содержание=Сессии в Django полностью основаны на cookie, и если они отключены на клиенте, то могут возникнуть проблемы с переключением языков. Решением является Accept-Language: когда браузер&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;устанавливает этот HTTP-заголовок, он руководствуется выбранными вами языковыми предпочтениями. Например, в Mozilla&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Firefox они находятся в Правка &amp;gt; Настройки &amp;gt; Дополнительно,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;на вкладке Общее. В разделе Языки, нажмите кнопку Выбрать&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;и переместите Английский язык наверх (см. рис. 1). Теперь&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Firefox будет считать, что английский вам роднее, и сообщит об&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;этом Django посредством Accept-Language. Не забудьте вернуть&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;настройки обратно, дабы не пугаться англоязычных интерфейсов ваших любимых сайтов!&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF107 88 1.png|center|thumb|250px|Рис.1. Укажите язык «админки» Django (и не только) в настройках Firefox.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Ширина=300px}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для начала давайте разберемся, как помечаются строки перевода&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для начала давайте разберемся, как помечаются строки перевода&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;в исходных текстах приложения. Откройте файл news/views.py. В&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;в исходных текстах приложения. Откройте файл news/views.py. В&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 128:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 139:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* language – язык, который был выбран.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* language – язык, который был выбран.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF107 90 1.png|thumb|150px|Рис. 2. Многообразие языков, поддерживаемых Django.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Список языков доступен в переменной LANGUAGES, но если&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Список языков доступен в переменной LANGUAGES, но если&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы посмотрите на сайт (рис. 2), то увидите огромный перечень,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы посмотрите на сайт (рис. 2), то увидите огромный перечень,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 168:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 180:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Добавьте каждому полю имя, текст справки (если требуется) и&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Добавьте каждому полю имя, текст справки (если требуется) и&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;форму множественного числа. Перейдите в каталог news и проделайте те же действия по созданию, переводу и компиляции языковых файлов, что я описывал ранее. После всех операций у вас должно получиться что-то вроде изображенного на рис. 3 и 4.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;форму множественного числа. Перейдите в каталог news и проделайте те же действия по созданию, переводу и компиляции языковых файлов, что я описывал ранее. После всех операций у вас должно получиться что-то вроде изображенного на рис. 3 и 4.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF107 90 2.png|frame|center|Рис. 3. Русифицированная главная страница админки…]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Изображение:LXF107 90 3.png|frame|center|Рис. 4. ...и форма добавления новостей.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Кэширование ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Кэширование ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 183:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 198:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;соответственно), далее идут три слэша и путь до директории, в которой вы собираетесь хранить данные.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;соответственно), далее идут три слэша и путь до директории, в которой вы собираетесь хранить данные.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Заголовок=Уровнем ниже&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Содержание=Низкоуровневое кэширование позволяет хранить любые данные, от переменных и экземпляров классов до фрагментов&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;шаблонов и баз данных. Для работы с ним нужно импортировать в представление модуль cache:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt; from django.core.cache import cache&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В большинстве случаев вам будет достаточно пользоваться тремя функциями – cache.set для создания кэша, cache.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;get для извлечения данных, cache.delete для удаления кэша.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Рассмотрим их поподробнее:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* cache.set('name', 'value', 60) принимает три параметра: имя кэша, значение и время хранения.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* cache.get('name') – принимает только имя.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* cache.delete('name') – только имя.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;|Ширина=300px}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Django предоставляет высокоуровневые механизмы для генерации кэша и извлечения его из базы данных. Так, самым верхним&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Django предоставляет высокоуровневые механизмы для генерации кэша и извлечения его из базы данных. Так, самым верхним&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;объектом является кэш всех страниц сайта. Однако если на странице&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;объектом является кэш всех страниц сайта. Однако если на странице&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;находятся динамические данные, которые индивидуальны для каждого пользователя, например, строка приветствия («Здравствуйте,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;находятся динамические данные, которые индивидуальны для каждого пользователя, например, строка приветствия («Здравствуйте,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Имя»), то все посетители будут видеть приветствие для пользователя, который зашел на сайт самым первым. Если же таких элементов нет, это – самый быстрый способ создать кэш сайта. Чтобы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Имя»), то все посетители будут видеть приветствие для пользователя, который зашел на сайт самым первым. Если же таких элементов нет, это – самый быстрый способ создать кэш сайта. Чтобы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;включить его, достаточно добавить строку 'django.middleware.cache.CacheMiddleware' в кортеж MIDDLEWARE_CLASSES в файле &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;настро-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;включить его, достаточно добавить строку 'django.middleware.cache.CacheMiddleware' в кортеж MIDDLEWARE_CLASSES в файле &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;настроек&lt;/ins&gt;. Она должна стоять самой первой в кортеже. На нашем сайте нет&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ек&lt;/del&gt;. Она должна стоять самой первой в кортеже. На нашем сайте нет&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;приветствия, однако есть возможность смены языков, и после того&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;приветствия, однако есть возможность смены языков, и после того&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как кэш страницы создан для одного языка, он будет отображаться&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;как кэш страницы создан для одного языка, он будет отображаться&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 194:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 220:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Следующим глобальным объектом для кэширования является&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Следующим глобальным объектом для кэширования является&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;представление. И опять, здесь мы сталкиваемся с теми же &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;недостат-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;представление. И опять, здесь мы сталкиваемся с теми же &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;недостатками&lt;/ins&gt;, что и при кэшировании всех страниц сайта, с единственным&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ками&lt;/del&gt;, что и при кэшировании всех страниц сайта, с единственным&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;отличием: мы сами вправе выбирать, какие страницы будут &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;кэшироваться&lt;/ins&gt;, а какие – нет. Вы можете импортировать в ваше &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;представление &lt;/ins&gt;декоратор cache_page:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;отличием: мы сами вправе выбирать, какие страницы будут &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;кэши-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;роваться&lt;/del&gt;, а какие – нет. Вы можете импортировать в ваше &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;представ-&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ление &lt;/del&gt;декоратор cache_page:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; from django.views.decorators.cache import cache_page&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; from django.views.decorators.cache import cache_page&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и применить его к какому-либо представлению, например:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;и применить его к какому-либо представлению, например:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8130&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Django}} == В гостях хорошо, а дома лучше == : ''ЧАСТЬ 3 В мире существуют языки, отличные от английского,...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:Django&amp;diff=8130&amp;oldid=prev"/>
				<updated>2009-06-21T13:08:50Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Django}} == В гостях хорошо, а дома лучше == : &amp;#039;&amp;#039;ЧАСТЬ 3 В мире существуют языки, отличные от английского,...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Django}}&lt;br /&gt;
== В гостях хорошо, а дома лучше ==&lt;br /&gt;
: ''ЧАСТЬ 3 В мире существуют языки, отличные от английского, и компьютеры попроще IBM Roadrunner. '''Никита Шультайс''' покажет, как Django справляется и с тем, и с другим.''&lt;br /&gt;
&lt;br /&gt;
До сих пор мы созерцали «админку» на английском языке,&lt;br /&gt;
однако ее русификация – тоже не проблема. Для этого нуж-&lt;br /&gt;
но всего лишь добавить в кортеж MIDDLEWARE_CLASSES в&lt;br /&gt;
файле settings.py следующую строку:&lt;br /&gt;
 'django.middleware.locale.LocaleMiddleware',&lt;br /&gt;
Она вызывает специальный обработчик, который отыскивает&lt;br /&gt;
нужный перевод. Чтобы определить, какой язык требуется, Django&lt;br /&gt;
делает следующее:&lt;br /&gt;
# Ищет в текущей сессии пользователя значение ключа django_language.&lt;br /&gt;
# Если поиск завершился провалом, Django изучает HTTP-заголовок Accept-Language, генерируемый вашим браузером в соответствии с локальными настройками.&lt;br /&gt;
# Наконец, если ничего не было найдено, используется значение переменной LANGUAGE_CODE, установленное в файле settings.py.&lt;br /&gt;
&lt;br /&gt;
Если основной аудиторией вашего сайта будут русскоязычные пользователи, имеет смысл присвоить переменной LANGUAGE_CODE в файле settings.py значение ru.&lt;br /&gt;
&lt;br /&gt;
Основным понятием, которым оперирует Django при интернационализации, являются строки перевода – помеченный особым&lt;br /&gt;
образом текст в ваших исходных кодах или шаблонах. Собственно&lt;br /&gt;
процесс перевода реализуется библиотекой gettext, которая входит в состав Python. Чтобы ваше приложение стало доступным на&lt;br /&gt;
нескольких языках, нужно пройти несколько этапов:&lt;br /&gt;
# Определить строки перевода в исходных текстах и шаблонах.&lt;br /&gt;
# Запустить утилиту make-messages.py, которая найдет все строки перевода и создаст из них языковой файл.&lt;br /&gt;
# Перевести полученный языковой файл.&lt;br /&gt;
# Запустить утилиту mcompile-messages.py, которая скомпилирует языковой файл в формат, пригодный для его дальнейшего использования системой.&lt;br /&gt;
При этом предполагается, что строки перевода используют&lt;br /&gt;
английский язык.&lt;br /&gt;
&lt;br /&gt;
=== Что переводить? ===&lt;br /&gt;
Для начала давайте разберемся, как помечаются строки перевода&lt;br /&gt;
в исходных текстах приложения. Откройте файл news/views.py. В&lt;br /&gt;
первую очередь, нужно импортировать функцию ugettext() (она, в&lt;br /&gt;
отличии от gettext(), отлично справляется с Unicode):&lt;br /&gt;
 from django.utils.translation import ugettext as _&lt;br /&gt;
Как можно заметить, для импортированной функции мы создали псевдоним: _ (подчеркивание). Это было сделано для повышения удобочитаемости кода, содержащего большое число строк перевода.&lt;br /&gt;
&lt;br /&gt;
Затем, давайте передадим функции _() текст, который&lt;br /&gt;
мы собираемся перевести, и присвоим результат переменной&lt;br /&gt;
application_name:&lt;br /&gt;
 application_name = _(&amp;quot;news&amp;quot;)&lt;br /&gt;
Поместим эту строку в представление last_news, а переменную&lt;br /&gt;
application_name передадим в шаблон:&lt;br /&gt;
&amp;lt;pre&amp;gt;context = RequestContext(request, {&lt;br /&gt;
&amp;quot;last_news&amp;quot;:news,&lt;br /&gt;
&amp;quot;application_name&amp;quot;:application_name&lt;br /&gt;
})&amp;lt;/pre&amp;gt;&lt;br /&gt;
Теперь откройте шаблон news/templates/news/lats_news.html и&lt;br /&gt;
добавьте имя нашего приложения в строку 4:&lt;br /&gt;
&amp;lt;pre&amp;gt;1-3 ...&lt;br /&gt;
4 &amp;lt;h2&amp;gt;{{ application_name }}&amp;lt;/h2&amp;gt;&lt;br /&gt;
5-...&amp;lt;/pre&amp;gt;&lt;br /&gt;
В шаблон news/templates/news/news_detail.html нужно&lt;br /&gt;
импортировать тэги интернационализации. Для этого в строке 2&lt;br /&gt;
напишите:&lt;br /&gt;
 {% load i18n %}&lt;br /&gt;
после чего в шаблоне будет доступен тэг {% trans %} (и не только),&lt;br /&gt;
с помощью которого мы будем отмечать строки перевода. Замените&lt;br /&gt;
текст в строке 5:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;5 &amp;lt;h1&amp;gt;{{ news.title }}&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
на&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;h1&amp;gt;{% trans &amp;quot;News&amp;quot; %}&amp;lt;br/&amp;gt;{{ news.title }}&amp;lt;/h1&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Думаю, вы уже догадались, как все это работает. В соответствии&lt;br /&gt;
с нашим планом, настало время запустить специальную утилиту и&lt;br /&gt;
создать языковый файл.&lt;br /&gt;
&lt;br /&gt;
=== Вавилонское смешение ===&lt;br /&gt;
Для начала, откройте терминал, перейдите в директорию приложения news и создайте в ней каталог locale:&lt;br /&gt;
 cd news&lt;br /&gt;
 mkdir locale&lt;br /&gt;
Утилита make-messages.py находится в поддиректории bin установки Django. Вызовите ее со следующими параметрами:&lt;br /&gt;
 python /путь/до/django/bin/make-messages.py -l ru&lt;br /&gt;
Если все пройдет удачно, в директории news/locale будут созданы дополнительные каталоги ru/LC_MESSAGES, а в них – языковый&lt;br /&gt;
файл django.po, который и нужно переводить. Откройте его в любом&lt;br /&gt;
текстовом редакторе (для удобства можно пользоваться программой KBabel из KDE). Вы увидите следующее:&lt;br /&gt;
&amp;lt;pre&amp;gt;#: views.py:23&lt;br /&gt;
msgid &amp;quot;news&amp;quot;&lt;br /&gt;
msgstr &amp;quot;&amp;quot;&lt;br /&gt;
#: templates/news/news_detail.html:5&lt;br /&gt;
msgid &amp;quot;News&amp;quot;&lt;br /&gt;
msgstr &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Первая запись в каждом блоке указывает место, где была найдена строка перевода, далее идет текст, который нужно перевести,&lt;br /&gt;
и наконец, сам перевод (у нас его пока нет). Мы специально создали два варианта слова «news» – с заглавной буквы и с маленькой,&lt;br /&gt;
чтобы наглядно продемонстрировать, что система воспринимает&lt;br /&gt;
их как разные слова. Заполните пустые строки русскими «новости» и «Новости». После того, как с переводом языкового файла&lt;br /&gt;
будет покончено, скомпилируйте его. Для этого воспользуйтесь&lt;br /&gt;
утилитой compile-messages.py, которая опять же входит в состав&lt;br /&gt;
Django:&lt;br /&gt;
 python /путь/до/django/bin/compile-messages.py&lt;br /&gt;
В каталоге LC_MESSAGES появляется скомпилированный языковой файл django.mo. Все готово: наше приложение теперь поддерживает два языка.&lt;br /&gt;
&lt;br /&gt;
=== Смена языка на сайте ===&lt;br /&gt;
Мы уже выяснили, как задать язык для клиентов с отключенными&lt;br /&gt;
cookie, однако далеко не все пользователи догадаются так поступить, да и у большинства ваших посетителей cookie так или иначе&lt;br /&gt;
включены. Значит, чтобы сменить язык сайта, нужно только переписать cookie, которые за это отвечают. И опять Django не оставляет&lt;br /&gt;
нас в беде. Для начала откроем главный файл с URL-картами – urls.&lt;br /&gt;
py, и после строки&lt;br /&gt;
 (r'^news/', include('news.urls')),&lt;br /&gt;
добавим&lt;br /&gt;
 (r'^i18n/', include('django.conf.urls.i18n')),&lt;br /&gt;
Далее, откроем файл settings.py и добавим следующие&lt;br /&gt;
строки:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;TEMPLATE_CONTEXT_PROCESSORS = (&lt;br /&gt;
&amp;quot;django.core.context_processors.auth&amp;quot;,&lt;br /&gt;
&amp;quot;django.core.context_processors.i18n&amp;quot;,&lt;br /&gt;
&amp;quot;django.core.context_processors.request&amp;quot;,&lt;br /&gt;
)&amp;lt;/source&amp;gt;&lt;br /&gt;
Так мы подключим к нашей системе три контекстных процессора,&lt;br /&gt;
которые добавляют в шаблоны глобальные переменные для работы с текущим пользователем, переменные языковых настроек и&lt;br /&gt;
содержимое HTTP-запроса, соответственно. Откройте файл media/templates/index.html и после тэга &amp;lt;body&amp;gt; добавьте:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line=&amp;quot;GESHI_NORMAL_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;/i18n/setlang/&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input name=&amp;quot;next&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;{{ request.PATH_INFO }}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;language&amp;quot;&amp;gt;&lt;br /&gt;
{% for lang in LANGUAGES %}&lt;br /&gt;
&amp;lt;option value=&amp;quot;{{ lang.0 }}&amp;quot;&lt;br /&gt;
{% ifequal lang.0 LANGUAGE_CODE %}&lt;br /&gt;
selected=&amp;quot;selected&amp;quot;&lt;br /&gt;
{% endifequal%}&amp;gt;{{ lang.1 }}&amp;lt;/option&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Go&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В строке 1 задается форма, данные из которой будут направлены на встроенное в Django приложение django.views.i18n.set_language, расположенное по адресу /i18n/setlang/ и отвечающее&lt;br /&gt;
за смену языка сайта. Оно принимает POST-запрос, содержащий&lt;br /&gt;
следующие переменные:&lt;br /&gt;
* next – адрес, куда будет перенаправлен пользователь после смены языка. Это, как правило, адрес страницы, на которой мы решили поменять язык. Он содержится в переменной request.PATH_INFO, которую мы передаем в шаблон с помощью контекстного процессора django.core.context_processors.request.&lt;br /&gt;
* language – язык, который был выбран.&lt;br /&gt;
&lt;br /&gt;
Список языков доступен в переменной LANGUAGES, но если&lt;br /&gt;
вы посмотрите на сайт (рис. 2), то увидите огромный перечень,&lt;br /&gt;
из которого нам нужны только два языка. Дело в том, что если&lt;br /&gt;
в settings.py не определена какая-либо переменная, то ее значение автоматически берется из файла настроек Django – django/conf/global_settings.py, а там представлен кортеж LANGUAGES,&lt;br /&gt;
содержащий все языки, поддерживаемые системой: это более 40&lt;br /&gt;
наименований (в том числе, языки, в которых символы пишутся&lt;br /&gt;
справа налево). Чтобы оставить только те из них, которые нам&lt;br /&gt;
действительно необходимы, добавим в файл settings.py следующий кортеж:&lt;br /&gt;
&amp;lt;pre&amp;gt;LANGUAGES = (&lt;br /&gt;
('en', gettext_noop('English')),&lt;br /&gt;
('ru', gettext_noop('Russian')),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
не забыв написать перед ним:&lt;br /&gt;
 gettext_noop = lambda s: s&lt;br /&gt;
Теперь, если вы загрузите сайт, вам будут доступны только два&lt;br /&gt;
языка. Вернемся опять к нашей форме: в строке 6 вы найдете новый&lt;br /&gt;
тэг шаблона ifequal – он сравнивает две переданные переменные, и&lt;br /&gt;
если они одинаковы, выполняет код в строке 7.&lt;br /&gt;
&lt;br /&gt;
=== Особенности перевода админки ===&lt;br /&gt;
В отличиe от представлений, где мы вызывали функцию ugettext, в&lt;br /&gt;
«админке» желательно использовать функцию ленивого (отложенного) перевода ugettext_lazy. Ее главное отличие в том, что перевод&lt;br /&gt;
осуществляется не сразу, а в момент использования строки, например, при обработке шаблона в «админке» Django. Импортируйте эту&lt;br /&gt;
функцию в файле news/models.py:&lt;br /&gt;
 from django.utils.translation import ugettext_lazy as _&lt;br /&gt;
Каждое поле модели принимает первым позиционным аргументом свое имя, поэтому строку&lt;br /&gt;
 title = models.CharField(max_length=70)&lt;br /&gt;
можно заменить на&lt;br /&gt;
 title = models.CharField(_('title'),max_length=70)&lt;br /&gt;
В дополнение к имени поля можно передать текст справки.&lt;br /&gt;
Замените на&lt;br /&gt;
 description = models.CharField(help_text=_('Not more than 255 symbols.'),max_length=255)&lt;br /&gt;
И, наконец, если вам уже надоело слово «News» на главной&lt;br /&gt;
странице «админки», измените его на более подходящее. Добавьте&lt;br /&gt;
в класс News подкласс Meta (напомню, что он обеспечивает дополнительные настройки модели), а внутри него объявите переменную,&lt;br /&gt;
отвечающую за множественное число:&lt;br /&gt;
 class Meta:&lt;br /&gt;
 verbose_name_plural = _('news')&lt;br /&gt;
Добавьте каждому полю имя, текст справки (если требуется) и&lt;br /&gt;
форму множественного числа. Перейдите в каталог news и проделайте те же действия по созданию, переводу и компиляции языковых файлов, что я описывал ранее. После всех операций у вас должно получиться что-то вроде изображенного на рис. 3 и 4.&lt;br /&gt;
&lt;br /&gt;
=== Кэширование ===&lt;br /&gt;
Наиболее слабыми звеньями работы сайта являются доступ к базе&lt;br /&gt;
данных и компилирование шаблонов, поэтому стоит сразу задуматься о кэшировании данных. Django прекрасно справляется этой&lt;br /&gt;
задачей и позволяет создавать и хранить кэш самыми различными&lt;br /&gt;
способами и в самых разных местах:&lt;br /&gt;
* В оперативной памяти. Такая возможность достигается с помощью программы Memcached, которая служит промежуточным звеном между данными в памяти и Django. Несомненно, этот способ является наибыстрейшим, однако ваш сервер должен обладать достаточным количеством памяти, чтобы хватило и для Django, и для кэша.&lt;br /&gt;
* В базе данных. В этом случае о скорости доступа к данным нельзя говорить однозначно, так как тут нужно учитывать настройки самой БД; однако если все сделано с умом, можно ожидать хороших результатов.&lt;br /&gt;
* В файловой системе. Самый простой вариант. Его мы и будем использовать.&lt;br /&gt;
Откроем файл settigns.py и объявим в нем переменную:&lt;br /&gt;
 CACHE_BACKEND = 'file:///путь/до/кэша'&lt;br /&gt;
Слово file означает, что мы собираемся использовать файловую&lt;br /&gt;
систему (против memcached и db для оперативной памяти и СУБД,&lt;br /&gt;
соответственно), далее идут три слэша и путь до директории, в которой вы собираетесь хранить данные.&lt;br /&gt;
&lt;br /&gt;
Django предоставляет высокоуровневые механизмы для генерации кэша и извлечения его из базы данных. Так, самым верхним&lt;br /&gt;
объектом является кэш всех страниц сайта. Однако если на странице&lt;br /&gt;
находятся динамические данные, которые индивидуальны для каждого пользователя, например, строка приветствия («Здравствуйте,&lt;br /&gt;
Имя»), то все посетители будут видеть приветствие для пользователя, который зашел на сайт самым первым. Если же таких элементов нет, это – самый быстрый способ создать кэш сайта. Чтобы&lt;br /&gt;
включить его, достаточно добавить строку 'django.middleware.cache.CacheMiddleware' в кортеж MIDDLEWARE_CLASSES в файле настро-&lt;br /&gt;
ек. Она должна стоять самой первой в кортеже. На нашем сайте нет&lt;br /&gt;
приветствия, однако есть возможность смены языков, и после того&lt;br /&gt;
как кэш страницы создан для одного языка, он будет отображаться&lt;br /&gt;
и для другого.&lt;br /&gt;
&lt;br /&gt;
Следующим глобальным объектом для кэширования является&lt;br /&gt;
представление. И опять, здесь мы сталкиваемся с теми же недостат-&lt;br /&gt;
ками, что и при кэшировании всех страниц сайта, с единственным&lt;br /&gt;
отличием: мы сами вправе выбирать, какие страницы будут кэши-&lt;br /&gt;
роваться, а какие – нет. Вы можете импортировать в ваше представ-&lt;br /&gt;
ление декоратор cache_page:&lt;br /&gt;
 from django.views.decorators.cache import cache_page&lt;br /&gt;
и применить его к какому-либо представлению, например:&lt;br /&gt;
 @cache_page(60 * 15)&lt;br /&gt;
 def last_news(request):&lt;br /&gt;
 ...&lt;br /&gt;
Декоратор принимает единственный параметр – время жизни&lt;br /&gt;
кэша в секундах.&lt;br /&gt;
&lt;br /&gt;
Аналогично можно кэшировать и шаблоны. Откройте файл&lt;br /&gt;
news/templates/news/last_news.html и добавьте после {% extends&lt;br /&gt;
«index.html» %} строку:&lt;br /&gt;
 {% load cache %}&lt;br /&gt;
далее, перед {% for news in last_news %} добавьте&lt;br /&gt;
 {% cache 31536000 last_news LANGUAGE_CODE %}&lt;br /&gt;
а после {% endfor %}:&lt;br /&gt;
 {% endcache %}&lt;br /&gt;
Сначала мы подключаем дополнительные тэги для кэширования,&lt;br /&gt;
затем вызываем тэг {% cache %} с тремя параметрами (вообще-то&lt;br /&gt;
достаточно двух). Первый – время жизни кэша в секундах (у нас&lt;br /&gt;
это целый год), второй – название, а третий – тоже название, но в&lt;br /&gt;
нашем случае это переменная, которая вычисляется динамически, а&lt;br /&gt;
следовательно, для разных языков у нас создается свой кэш. То же&lt;br /&gt;
самое можно сделать и для приветствия.&lt;br /&gt;
&lt;br /&gt;
=== Сигналы ===&lt;br /&gt;
Кэширование позволяет сделать сайт очень быстрым, но как&lt;br /&gt;
быть, если вы определили время жизни кэша в три дня и добавили новость через два? Ведь пока кэш жив, система будет отображать именно его, и нашим посетителям придется ждать целый&lt;br /&gt;
день. С другой стороны, ставить слишком маленький промежуток&lt;br /&gt;
тоже нет смысла – тогда от системы кэширования не будет пользы. Предугадать невозможно, да и незачем. Оптимальный вариант – удалять кэш при наступлении какого-либо события (новость&lt;br /&gt;
добавлена, новость удалена и т.д.). Уведомлением о событии служит сигнал. Создадим внутри директории news файл signals.py&lt;br /&gt;
следующего содержания:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line=&amp;quot;GESHI_NORMAL_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
from django.core.cache import cache&lt;br /&gt;
from settings import LANGUAGES&lt;br /&gt;
&lt;br /&gt;
def delete_last_news_cache():&lt;br /&gt;
for lang in LANGUAGES:&lt;br /&gt;
cache.delete('last_news:'+ lang[0])&amp;lt;/source&amp;gt;&lt;br /&gt;
Обратите внимание на строку 6, где мы генерируем имя кэша.&lt;br /&gt;
Здесь учтено, что Django соединяет все, что было передано тэгу {%&lt;br /&gt;
cache %}, символом двоеточия. Поскольку мы не знаем, для каких&lt;br /&gt;
языков был создан кэш, то удаляем все возможные варианты – в&lt;br /&gt;
нашем случае их всего два.&lt;br /&gt;
&lt;br /&gt;
Как же сделать, чтобы этот код выполнялся? Проще простого. Откроем файл news/models.py и добавим в начало следующие&lt;br /&gt;
строки:&lt;br /&gt;
 from django.db.models import signals&lt;br /&gt;
 from django.dispatch import dispatcher&lt;br /&gt;
 from news.signals import delete_last_news_cache&lt;br /&gt;
а в конец:&lt;br /&gt;
 dispatcher.connect(delete_last_news_cache,signal=signals.post_save,sender=News)&lt;br /&gt;
 dispatcher.connect(delete_last_news_cache,signal=signals.post_delete,sender=News)&lt;br /&gt;
Теперь в системе зарегистрированы два сигнала от передатчика&lt;br /&gt;
(sender) News. Первый сигнал генерируется после сохранения объекта в базе данных, то есть при его создании или изменении, а второй – после удаления. В обоих случаях выполняется функция delete_last_news_cache, определенная выше. Вообще, для обращения к&lt;br /&gt;
базе данных в Django существует семь сигналов: pre_init, post_init,&lt;br /&gt;
pre_save, post_save, pre_delete, post_delete и post_syncdb, названия&lt;br /&gt;
которых говорят сами за себя.&lt;br /&gt;
&lt;br /&gt;
=== И сверх этого ===&lt;br /&gt;
Кроме возможности создавать кэш ваших данных, Django поддерживает и другие способы оптимизации. Чтобы сделать ваш сайт еще,&lt;br /&gt;
быстрее нужно добавить в кортеж MIDDLEWARE_CLASSES в файле&lt;br /&gt;
settings.py следующие строки:&lt;br /&gt;
 'django.middleware.http.ConditionalGetMiddleware',&lt;br /&gt;
 'django.middleware.gzip.GZipMiddleware',&lt;br /&gt;
Первая из них включает поддержку условных GET-запросов&lt;br /&gt;
(использование ETag и Last-Modified в HTTP-заголовках), а вторая&lt;br /&gt;
отвечает за сжатие содержимого для браузеров, которые поддерживают такую возможность (а это все современные реализации).&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>