我目前正在与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,但这似乎是一项非常重要的任务(至少对那些对我的内部知之甚少的人,比如我)。
我查看了一些第三方自动插件字段,但我无法想象任何可以使用这种特殊情况和翻译库。
我的问题是......
编辑:已建议发现信号优先级,并由Django核心开发人员击落。
答案 0 :(得分:0)
由于Django团队选择不支持在钩子上注册的方法的订购,而nani使用它们实现翻译保存,我发现没有明确的方法来确保我的代码在nani的post_save方法之后运行。
最后,我分叉了nani并添加了一个自定义信号,当post_save完成时会触发该信号。这不是理想的(在我看来),但它确实有效。