現在、プロジェクトで翻訳されたモデルを有効にするために 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)
これにより、 product_post_save の最初の行でProductTranslation 一致するクエリがありませんDoesNotExist 例外が発生します。
post_save を使用する代わりに、save メソッドをオーバーライドするように nani をリファクタリングして簡単に試してみましたが、それは重要な作業のようです (少なくとも、私のようにその内部についてほとんど知らない人にとっては)。
私はいくつかのサードパーティの自動スラッグ フィールドを見てきましたが、この特定の状況と翻訳ライブラリで機能するものは想像できません。
私の質問は...
- 1 つの post_save が定義されている他のすべての後に並んでいることを確認する方法はありますか?
- それを除けば、他の誰かがこの問題に対する別の/より良い解決策を提案できますか?
編集:シグナルの優先順位が提案され、Django コア開発者によって削除されたことがわかりました。