<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Django_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B</id>
	<title>Django полезные советы - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=Django_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Django_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B&amp;action=history"/>
	<updated>2026-04-03T19:12:58Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=Django_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B&amp;diff=548&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «== '''Полезные советы новичкам:''' ==  1. Не указывайте имя проекта в импорте Предположим что у…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=Django_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B&amp;diff=548&amp;oldid=prev"/>
		<updated>2013-08-24T10:32:51Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== &amp;#039;&amp;#039;&amp;#039;Полезные советы новичкам:&amp;#039;&amp;#039;&amp;#039; ==  1. Не указывайте имя проекта в импорте Предположим что у…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== '''Полезные советы новичкам:''' ==&lt;br /&gt;
&lt;br /&gt;
1. Не указывайте имя проекта в импорте&lt;br /&gt;
Предположим что у вас есть приложение &amp;quot;vasya&amp;quot; в проекте &amp;quot;my&amp;quot; не указывайте следующим образом&lt;br /&gt;
&lt;br /&gt;
 from my.vasya.models import Hero&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вы не сможете повторно использовать это приложение, а сменить имя проекта будет сущей проблемой. Сделайте так:&lt;br /&gt;
&lt;br /&gt;
 from vasya.models import Hero&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну а для сохранения работоспособности необходимо добавить в пути питона директорию вашего проложения следующим образом:&lt;br /&gt;
&lt;br /&gt;
 import syssys.path.insert(0, &amp;lt;путь к папкам app&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Не программируйте жестко пути MEDIA_ROOT и TEMPLATE_DIRS&lt;br /&gt;
Не присваивайте следующим образом параметры MEDIA_ROOT и TEMPLATE_DIRS в файле setting.py:&lt;br /&gt;
&lt;br /&gt;
 TEMPLATE_DIRS = ( &amp;quot;/home/html/project/templates&amp;quot;,)MEDIA_ROOT = &amp;quot;/home/html/project/appmedia/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Это вызовет много проблем при переносе проекта на другую операционную систему.&lt;br /&gt;
Используя следующую технику вы легко сможете обойти эту проблему:&lt;br /&gt;
&lt;br /&gt;
 SITE_ROOT = os.path.realpath(os.path.dirname(__file__))MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia')TEMPLATE_DIRS = ( os.path.join(SITE_ROOT,  'templates'),)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Техника от Rob Hudson, детальная инфомация по следующей ссылке.&lt;br /&gt;
Не программируйте жестко пути к статическим файлам&lt;br /&gt;
Когда вам нужно сделать ссылку на статические ресурсы(javascript, css, картинки) не пользуйтесь следующим способом (MEDIA_URL = “/appmedia/”):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/appmedia/wysiwyg/jHtmlArea.css&amp;quot; /&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/appmedia/wysiwyg/jHtmlArea.js&amp;quot;&amp;gt; &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Проблема появится тогда, когда вы захотите перенести статические ресурсы на другой сервер. Избавится от нее вам поможет использование переменной  {{MEDIA_URL}} которой необходимо присвоить значение &amp;quot;/appmedia/&amp;quot; в файле settings.py:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;{{MEDIA_URL}}wysiwyg/jHtmlArea.css&amp;quot; /&amp;gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;  src=&amp;quot;{{MEDIA_URL}}wysiwyg/jHtmlArea.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
А как же получить переменные окружения(сontext variable)?&lt;br /&gt;
Просто :). Что бы добавить переменные(например, пользователя или запрашиваемую страницу) в шаблон воспользуйтесь добавлением RequestContext(request) в метод render_to_response:&lt;br /&gt;
&lt;br /&gt;
 return render_to_response(&amp;quot;my_app/my_template.html&amp;quot;, {'some_var': 'foo'}, context_instance=RequestContext(request))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подробная информация.&lt;br /&gt;
Не пишите бизнес логику в функциях представлений&lt;br /&gt;
Не очень хорошая идея писать бизнес логику в представлениях (например, логика добавляющая сумму P на ваш банковский счет X, и отнимающая P с вашего счета Y.)&lt;br /&gt;
&lt;br /&gt;
Вы спросите почему?&lt;br /&gt;
1. Нет возможности написать unit тесты.&lt;br /&gt;
2. Нет возможности повторного использования кода.&lt;br /&gt;
&lt;br /&gt;
Так куда помещать такую логику?&lt;br /&gt;
Хорошей идеей будет поместить ее в модель или в дополнительную функцию.&lt;br /&gt;
&lt;br /&gt;
Менять DEBUG=False при переносе версии на рабочий сайт нудно&lt;br /&gt;
Часто мы забываем изменить DEBUG на значение False при переносе вернии на рабочий сайт. Да и нужно это.&lt;br /&gt;
&lt;br /&gt;
Исправить эту ситуацию можно 2-я способами:&lt;br /&gt;
1. Проверять на имя домена следующим образом:&lt;br /&gt;
&lt;br /&gt;
 import socketif socket.gethostname() == 'productionserver.com':  DEBUG = Falseelse:  DEBUG = True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первым озвучил ее Jokull. Подробнаи информация.&lt;br /&gt;
&lt;br /&gt;
2. Использовать дополнительный файл конфигурации для локальной среды разработки, в котором и можно переопределить все дополнительные параметры.&lt;br /&gt;
&lt;br /&gt;
 #Filename settings_debuy.py#It contains all variables from settings and it overrides the DEBUG variable to True#we use settings_debug.py to run the  server locally python manage.py runserver settings=settings_debug.pyfrom settings import *DEBUG = True#you can also add other things which helps you  to do the debugging easily#like Debug toolbar etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Детальная информация&lt;br /&gt;
&lt;br /&gt;
Загружать теги шаблонов сторонних приложений один раз&lt;br /&gt;
Перед использованием тегов в шаблонах необходимо сделать:&lt;br /&gt;
&lt;br /&gt;
 {% load template_tags %}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Данный код мы должны прописать в каждом шаблоне в котором мы хотим использовать данные теги. Исправить это мы можем добавив следующий код:&lt;br /&gt;
&lt;br /&gt;
 from django import templatetemplate.add_to_builtins('project.app.templatetags.custom_tag_module')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поместите этот код в любой файл который загружается на старте приложения(settings.py,urls.py,любой файл models.py в приложениях). Это позволит использовать данные теги без объявления загрузок в шаблонах.&lt;br /&gt;
Urls.py&lt;br /&gt;
Не описывайте все вашии урлы в project/urls.py&lt;br /&gt;
&lt;br /&gt;
 urlpatterns = patterns('',     url(r'^askalumini/question/$','.....registerInstitution',name='iregister'),     url(r'^askalumin/answer /$','someview.....',name='newmemberurl'),     url(r'^institution/member/$','someview.....',name=&amp;quot;dashboardurl&amp;quot;),     url(r'^institution/faculty /$','editInstitute',name=&amp;quot;editinstituteurl&amp;quot;),     url(r'^memeber/editprofile/$','editProfile',name=&amp;quot;editprofileurl&amp;quot;),     url(r'^member/changepassword /$','changePassword',name=&amp;quot;changepasswordurl&amp;quot;),     url(r'^member/forgotpassword /$','forgotPassword',name=&amp;quot;forgotpasswordurl&amp;quot;),     url(r'^member/changepicture/$','changePicture',name=&amp;quot;changepictureurl&amp;quot;),     url(r'^member/logout /$','memeberlogout',name=&amp;quot;logouturl&amp;quot;),         ,)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующий код позволить вам реализовывать приложения многократно. В файле project/urls.py описываем следующим образом:&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',     # Example:     (r'^$', include('institution.urls')),     (r'^institution/', include('institution.urls')),     (r'^askalumini/', include('askalumini.urls')),     (r'^member/', include('member.urls')),)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
а в каждом приложении так же создайте файлы urls.py и пропишите соответствующие url-ы в каждом из них(пример для приложения askalumini)&lt;br /&gt;
&lt;br /&gt;
 urlpatterns = patterns('askalumini.views',     url(r'^$','askHome',name='askaluminiurl'),     url(r'^questions/(?P\d+)/$','displayQuestion', name=  'askquestiondisplay'),     url(r'^askquestions/$','askQuestion',name='askquestionurl'),      url(r'^postcomment/$','postComment',name=&amp;quot;askquestioncomment&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Используйте наименование Url-ов для идентификации&lt;br /&gt;
При описании урлов мы указали параметр name. Данное наименование поможет разумно формировать url в моделях, представлениях и шаблонах.&lt;br /&gt;
Не программируйте жестко url-ы&lt;br /&gt;
Почему?&lt;br /&gt;
&lt;br /&gt;
Если вы измените структуру урлов в файле url.py вам понадобится сделать такие же изменения во всех местах где они были использованы.&lt;br /&gt;
view.py&lt;br /&gt;
Вместо того что бы жестко прописать урл следующим образом&lt;br /&gt;
&lt;br /&gt;
 HttpResponseRedirect(&amp;quot;/askalumini/questions/54&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
используйте функцию reverse&lt;br /&gt;
&lt;br /&gt;
from django.core.urlresolvers import reverseHttpResponseRedirect(reverse('askquestiondisplay',kwargs{'questionno':q.id}))&lt;br /&gt;
&lt;br /&gt;
models.py&lt;br /&gt;
В файле models.py к дополнению функции reverse вы также можете использовать models.permalink декоратор.&lt;br /&gt;
&lt;br /&gt;
 @models.permalinkdef get_absolute_url(self):     return ('profileurl2',(),{'userid': self.user.id})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Такой декоратор также использует имя для формирования урла.&lt;br /&gt;
templates.py&lt;br /&gt;
В шаблонах вы можете воспользоваться тегом url&lt;br /&gt;
&lt;br /&gt;
 {% url askquestiondisplay  345 %} Ask Question &lt;br /&gt;
&lt;br /&gt;
Отладка&lt;br /&gt;
а) Воспользуйтесь django-debug-toolbar для доступа к следующей информации:&lt;br /&gt;
1. Сколько sql запросов выполняется? За какое время?&lt;br /&gt;
2. Имя шаблона, логгирование, куки/сессия и т.д.&lt;br /&gt;
Описание всех возможностей можно найти по следующей ссылке&lt;br /&gt;
&lt;br /&gt;
б) Воспользуйтесь отладчиком Werkzeug, который позволит открыть консоль python-а на странице отображения ошибки и поможет быстро найти ошибку.&lt;br /&gt;
Детальная информация&lt;br /&gt;
&lt;br /&gt;
в) Используйте полезной утилитой для отладки, pdb.&lt;br /&gt;
&lt;br /&gt;
Если знаете про Pinax используйте его&lt;br /&gt;
Django способствует повторному использованию приложений. Pinax - проект который включает уже инфраструктуру повторно используемых приложений.&lt;br /&gt;
В одно время я попытался его использовать так как есть. Интересное интеграционное решение, являющееся деревом разнообразных многократно используемых проектов. Не понравилось только то, что этим &amp;quot;ящиком с приложениями&amp;quot; тяжело управлять. Попробуйте исключить пару ненужных модулей и сразу будет понятно, что все же интеграция получилась слишком тесной.&lt;br /&gt;
&lt;br /&gt;
Для более детальной информации обратитесь на сайт разработчиков http://pinaxproject.com/.&lt;br /&gt;
Необходимо знать и о других приложениях&lt;br /&gt;
1. Миграция&lt;br /&gt;
Как изменять версию приложения/БД на сайте при появлении следующих версий проекта в котором уже изменилась структура приложения/БД? Этот процесс и называется миграцией.&lt;br /&gt;
Есть несколько приложений которые вам помогут в этом:&lt;br /&gt;
 - django-evolutions - легкая в использовании, все делает автоматически, но не надежна&lt;br /&gt;
 - South - более надежна, но необходимо будет разбираться.&lt;br /&gt;
2. Шаблоны&lt;br /&gt;
Если вы считаете что язык шаблонов Django очень узкий тогда вы можете воспользоваться следующими:&lt;br /&gt;
 - template-utils&lt;br /&gt;
 - Jinja&lt;br /&gt;
&lt;br /&gt;
3. Другие приложения&lt;br /&gt;
 - django command extensions&lt;br /&gt;
 - Sorl&lt;br /&gt;
&lt;br /&gt;
статья автора: [http://night-fairy-tales.com/2009/09/django.html]http://night-fairy-tales.com/2009/09/django.html&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>