多个post_save信号导致翻译模型的slugify问题

时间:2011-11-04 18:17:17

标签: django django-models translation signals django-signals

我目前正在与django-nani合作,为项目启用翻译模型。

这些模型中有许多需要slug来生成URL。我的客户是非技术性的,并且要求他们进入slu is在预期和支持成本方面都是不合理的。翻译是一项新要求,因此我正在努力调整旧模型以进行翻译。

保存模型时,nani会注册post_save信号以保存翻译。这很好,除了现在如果我尝试注册一个post_save信号来使用所述翻译产生slu ,,我运气不好;我的信号在之后或同时运行,并且不存在转换对象。

令人讨厌的型号代码:

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第一行上的DoesNotExist异常。

我曾经简单地尝试重构nani来覆盖save方法而不是使用post_save,但这似乎是一项非常重要的任务(至少对那些对我的内部知之甚少的人,比如我)。

我查看了一些第三方自动插件字段,但我无法想象任何可以使用这种特殊情况和翻译库。

我的问题是......

  • 有没有办法确保一个post_save排在任何后面 其他定义的?
  • 除此之外,其他任何人都可以提出建议 这个问题的不同/更好的解决方案?

编辑:已建议发现信号优先级,并由Django核心开发人员击落。

1 个答案:

答案 0 :(得分:0)

由于Django团队选择不支持在钩子上注册的方法的订购,而nani使用它们实现翻译保存,我发现没有明确的方法来确保我的代码在nani的post_save方法之后运行。

最后,我分叉了nani并添加了一个自定义信号,当post_save完成时会触发该信号。这不是理想的(在我看来),但它确实有效。