Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
from .base import *
# отличающиеся настройки
|-project
|--settings
|---__init__.py
|---base.py
|---ci.py
|---dev.py
|---production.py
|---staging.py
но при повторном использовании приложений в других проектах приходилось менять пути импорта
from project_one.news.models import Model
from news.models import Model
Называйте ваш проект project (django-admin.py startproject project) — ну или другим, но одинаковым именем для всех проектов. Раньше я называл проекты соответственно домену, но при повторном использовании приложений в других проектах приходилось менять пути импорта — то from supersite import utils, то from newsite import utils. Это путает и отвлекает.Это вообще странно. Та структура каталогов, что у вас ниже нарисована вообще не подразумевает, что в импорты попадёт «название проекта». Их туда вообще не нужно включать, т.к. в пути надо включать именно внутренность этой папки проекта (которая вообще неважно как называется), потому непонятно как и зачем оно в импорты попадёт. Названия «основных приложений» как раз, имхо, надо делать разными. Это удобно, например, если несколько таких «основных приложений» рядом надо где-то положить. Для этого к такому виду и было приведено, емнип, в версии 1.4. До этого внутренности были снаружи и там действительно бывали проблемы с повторным использованием и импортами.

{% include 'slave.html' %}
{% include 'slave.html' with var=var %}
footer.html, а не ничего говорящее base.html.pre_save
class TestModel(DirtyFieldsMixin, models.Model):
boolean = models.BooleanField(default=True)
>>> tm = TestModel(boolean=True,characters="testing")
>>> tm.save()
>>> tm.boolean = False
>>> tm.is_dirty()
True
>>> tm.get_dirty_fields()
{'boolean': True}
class TreeModel(MPTTModel, DirtyFieldsMixin):
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
title = models.CharField(max_length=100)
slug = models.SlugField(max_length=70, db_index=True, unique=True)
path = models.CharField(max_length=255, editable=False, unique=True, db_index=True)
path — оно хранит адрес предков: /parent/parent/child/, и при сохранении предка надо это поле обновить у всех детей вниз по иерархии. А чтобы не дергать базу просто так, при сохранении модели я проверяю, изменилось ли поле slug и если да, обновляю его у всех детей.def save(self, *args, **kwargs):
self.path = self.slug
if self.parent:
self.path = '{}/{}'.format(self.parent.path, self.slug)
# Надо сохранить модель прежде, чем браться за детей, чтобы записать path,
# но после вызова super.save память о старых полях потрется,
# поэтому надо запомнить состояние
is_dirty = 'path' in self.get_dirty_fields()
super(TreeModel, self).save(*args, **kwargs)
# Если изменение поля было, пускаем рекурсию — каждый child запустит свою проверку
if is_dirty:
for child in self.get_children():
child.save()
{% for item in items %}
{% include 'item_description.html' %}
{% endfor %}
{% for item in items %}
{% cache 1800 list_item item.id item.modified %}
{% include 'item_description.html' %}
{% endcache %}
{% endfor %}
{% include 'google_analytics.html' %}
Но в данном случае переменная var передаётся в шаблон slave.html неявно — var передатся в master.html, а slave.html просто «цепляет» контекст master'а. Таким образом, мы видим, что шаблон внутри {% include %} зависит от контекста основного шаблона. Мы вынуждены следить за контекстом родительского шаблона, иначе в дочерний может попасть что-нибудь не то.
only:If you want to render the context only with the variables provided (or even no variables at all), use the only option. No other variables are available to the included template:
{% include "name_snippet.html" with greeting="Hi" only %}
if DEBUG:
INSTALLED_APPS += ...
Старайтесь не писать {% url 'shop/product' id=product.id %}.
Django tips & tricks