1

現在、プロジェクトで翻訳されたモデルを有効にするために 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 コア開発者によって削除されたことがわかりました。

4

1 に答える 1

1

Django チームはフックに登録されたメソッドの順序付けをサポートしないことを選択し、nani はそれらを使用して変換保存を実装しているため、コードが nani の post_save メソッドの後に実行されることを確認する明確な方法が見つかりませんでした。

最後に、nani をフォークして、post_save が終了したときに発火するカスタム シグナルを追加しました。(私の意見では)理想的ではありませんが、機能します。

于 2011-11-07T15:51:04.050 に答える