В настоящее время я работаю с django-nani, чтобы включить переведенные модели в проекте.
Многие из этих моделей требуют слагов для генерации URL. Мой клиент нетехнический, и просить его ввести слизняков было бы неразумно с точки зрения как ожиданий, так и затрат на поддержку. Перевод - это новое требование, поэтому я работаю над корректировкой старых моделей для перевода.
При сохранении модели nani регистрирует сигнал post_save с целью сохранения переводов. Это нормально, за исключением того, что теперь, если я попытаюсь зарегистрировать сигнал post_save, чтобы использовать указанные переводы для генерации слагов, мне не повезло; либо мой сигнал выполняется после, либо одновременно, и не существует никакого объекта перевода.
Код модели обидчика:
from django.db import models
from django.db.models import signals
from django.template.defaultfilters import slugify
from tinymce.models import HTMLField
from nani.models import TranslatableModel, TranslatedFields
class Product(TranslatableModel):
translations = TranslatedFields(
name = models.CharField(max_length=100),
title = models.CharField(max_length=100),
description = HTMLField(),
)
slug = models.SlugField(max_length=100, blank=True, null=True, editable=False),
# Various unrelated fields...
def __unicode__(self):
return self.translations.get(language_code='en').name
def product_post_save(sender, instance, created, **kwargs):
new_slug = slugify(instance.translations.get(language_code='en').name)
if instance.slug != new_slug:
instance.slug = new_slug
instance.save()
signals.post_save.connect(product_post_save, Product)
Это приводит к тому, что Запрос на сопоставление ProductTranslation не существует В первой строке product_post_save исключение IsNotExist.
Я кратко попытался провести рефакторинг nani, чтобы переопределить метод save вместо использования post_save, но это кажется нетривиальной задачей (по крайней мере для тех, кто мало знает о его внутренностях, таких как я).
Я смотрел на некоторые сторонние поля автозапуска, но я не могу представить, что они будут работать с этой конкретной ситуацией и библиотекой перевода.
Мои вопросы будут ...
- Есть ли способ убедиться, что одно post_save выстроено в линию после любого
другие, которые определены?
- За исключением этого, может кто-нибудь еще предложить
другое / лучшее решение этой проблемы?
Редактировать: Обнаружен приоритет сигнала, предложенный разработчиками ядра Django.