我目前正在使用 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 核心开发人员建议并击落。