私のサイトは複数の言語をサポートしています。サポートされている言語に対応する1つまたは複数の翻訳オブジェクト(CategoryTranslation)が必要なオブジェクト(Category)があります(これらは単純ではありませんので、翻訳アプリケーションを使用するためのアドバイスはしないでください)。また、依存オブジェクトには、それらを作成して最後に更新するユーザーへのリンクがあります。Django Adminインラインで編集不可能なフィールドの初期値を設定
私は私のカテゴリーの管理パネルで、次たい:
- カテゴリーフィールドを。
- Inlined Category既存の言語で初期化された翻訳オブジェクト。たとえば、私のサイトではロシア語と英語をサポートしていますが、2行しか表示されないようにする必要があります。
- カテゴリ保存後、新しいCategoryTranslationはcreated_byフィールドの値が現在のユーザーと等しくなるように編集されたCategoryTranslationはedited_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方法は、サポートされているlangaugesのカウントフォームはフォーム作成時に使用可能な言語で初期化されます。
更新 は私もsave_formsetで(自己、リクエスト、フォーム、フォームセット、変化する)方法をフォームセットとCategoryTranslationFormSetクラスのsave()メソッドで変更されたオブジェクトのフィールドを埋めるために彼を使用するために、現在のユーザーを設定します。
正しいですか?
だから今、私は必要があります。
- は(私は単にreadonly_fieldsタプルに追加した場合、私は形でそれを初期化することはできません)READ_ONLY LANGUAGE_CODEフィールドを作成します。
- を理解してください。保存する前にユーザーを追加するという私の解決策です。