Django architecture articles
- Against service layers in Django, two parts
- Corporative Django Styleguide
- Django models, encapsulation and data integrity
- Cosmic Python Book
Как сделать выделение активных пунктов меню
Create direcroty templatetags
in any app. In this directore
create file, for example, active.py
, with following content.
This template tag will be visible in whole project.
import re
from django import template
try:
from django.urls import reverse, NoReverseMatch
except ImportError:
from django.core.urlresolvers import reverse, NoReverseMatch
register = template.Library()
@register.simple_tag(takes_context=True)
def active(context, pattern_or_urlname):
try:
pattern = '^' + reverse(pattern_or_urlname)
except NoReverseMatch:
pattern = pattern_or_urlname
path = context['request'].path
if re.search(pattern, path):
return 'active'
return ''
Then you can use this template tag in following maner:
<li class="nav-item">
<a class="nav-link {% active 'customers_list' %}" href="{% url 'customers_list' %}"><i class="bi-filetype-pdf me-1"></i>Warehouse</a>
</li>
<li class="nav-item">
<a class="nav-link {% active 'orders:shablonizator' %}" href="{% url 'orders:shablonizator' %}"><i class="bi-app-indicator me-1"></i>{% trans "Шаблоны" %}</a>
</li>
Как в методе модели save
сравнить старые и новые значения
class Detail(models.Model):
printsheet = models.ForeignKey(PrintSheet, blank=True, null=True, on_delete=models.SET_NULL, related_name='details')
@classmethod
def from_db(cls, db, field_names, values):
"""
Helper function. In 'save' method we have _loaded_values attribute, which contain 'old' instance values.
"""
instance = super().from_db(db, field_names, values)
# save original values, when model is loaded from database,
# in a separate attribute on the model
instance._loaded_values = dict(zip(field_names, values))
return instance
def save(self, *args, **kwargs):
super(Detail, self).save(*args, **kwargs)
if self._loaded_values['printsheet_id'] != self.printsheet_id:
"""
Запускаем обновление цветов Листа, только если у Детали изменился связанный Лист.
Если у Детали поменялся связанный лист с L1 на L2, мы должны обновить оба листа.
Кроме того, деталь могла быть не связана с листом, или перестать быть связанной с листом, поэтому проверяем на None.
"""
print('Update color from Detail->Save')
if self.printsheet:
self.printsheet.update_colors()
if self._loaded_values['printsheet_id']:
old_sheet = PrintSheet.objects.get(id=self._loaded_values['printsheet_id'])
old_sheet.update_colors()