1

我目前正在使用 django-nani 在项目中启用翻译模型。

其中许多模型需要 slugs 来生成 URL。我的客户是非技术性的,要求他们进入 slug 就期望和支持成本而言都是不合理的。翻译是一个新的需求,所以我正在努力调整旧的翻译模型。

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

有问题的型号代码:

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)

这会导致 product_post_save 的第一行出现ProductTranslation 匹配查询不存在DoesNotExist 异常。

我曾短暂尝试重构 nani 以覆盖 save 方法而不是使用 post_save,但这似乎是一项不平凡的任务(至少对于像我这样对其内部结构知之甚少的人来说)。

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

我的问题是...

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

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

4

1 回答 1

1

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

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

于 2011-11-07T15:51:04.050 回答