1

私のサイトは複数の言語をサポートしています。サポートされている言語に対応する 1 つまたは複数の翻訳オブジェクト (CategoryTranslation) を持つ必要があるオブジェクト (Category) があります (それらはそれほど単純ではないため、翻訳アプリの使用を勧めないでください)。さらに、依存オブジェクトには、それらを作成および最終更新するユーザーへのリンクがあります。

カテゴリー管理パネルで以下を行いたい:

  1. カテゴリ フィールド。
  2. 既存の言語によって初期化されたインラインの CategoryTranslation オブジェクト。たとえば、私のサイトではロシア語と英語をサポートしており、2 つ (2 つだけ) のインラインを表示する必要があります。
  3. カテゴリの保存後、新しい CategoryTranslation は現在のユーザーと等しい created_by フィールド値を取得し、編集された CategoryTranslation は現在のユーザーと等しい edit_by フィールド値を取得する必要があります。

これが私が今やったことです:

class CategoryTranslationFormSet(BaseInlineFormSet):
    def total_form_count(self):
        return len(settings.LANGUAGES)

    def _construct_form(self, i, **kwargs):
        form = super(CategoryTranslationFormSet, self)._construct_form(i, **kwargs)
        form.initial['language_code'] = settings.LANGUAGES[i][0]
        return form

    def save(self, commit=True):
        translations = super(CategoryTranslationFormSet, self).save(commit=False)
        for translation in translations:
            if not translation.id:
                translation.created_by = self.user
            translation.edited_by = self.user
            translation.save()

class CategoryTranslationAdmin(admin.TabularInline):
    model = CategoryTranslation
    formset = CategoryTranslationFormSet
    max_num = 0

    fields = ('title', 'description', 'language_code', 'created_by', 'created', 'edited_by', 'edited')
    readonly_fields = ('created_by', 'created', 'edited_by', 'edited')


class CategoryAdmin(tree_editor.TreeEditor):
    fieldsets = (
        (None, {'fields': ('parent', 'is_list', 'is_active')}),
        (_('Audit'), {'fields': ('created_by', 'created', 'edited_by', 'edited'),
                      'classes': ('collapse',)
        }),
        )
    readonly_fields = ('created_by', 'created', 'edited_by', 'edited')
    list_display = ('is_list', 'is_active')
    inlines = [CategoryTranslationAdmin]

    def save_model(self, request, obj, form, change):
        add_user_for_audit(request, obj, change)
        super(CategoryAdmin, self).save_model(request, obj, form, change)

    def save_formset(self, request, form, formset, change):
        formset.user = request.user
        super(CategoryAdmin, self).save_formset(request, form, formset, change)

ご覧のとおり、CategoryTranslationAdmin の max_num フィールドは 0 で、追加の翻訳が追加されるのを防ぎます。フォーム セットの total_form_count メソッドは、サポートされている言語の数と、フォームの作成時に使用可能な言語で初期化されたフォームを返します。

更新 また、現在のユーザーを save_formset(self, request, form, formset, change) メソッドで formset に設定し、それを使用して、 CategoryTranslationFormSet クラスの save() メソッドで変更されたオブジェクトのフィールドに入力します。

それが正しいか?

だから今私は必要です:

  1. language_code フィールドを read_only にします (単純に readonly_fields タプルに追加すると、フォームで初期化できなくなります)。
  2. 理解してください、保存する前にユーザーを追加する私の解決策は正しいです。
4

1 に答える 1