1
我的网站支持多种语言。我有一个对象(类别)应该有一个或多个翻译对象(类别翻译)分别支持的语言(他们不是那么简单,所以,请不要建议使用翻译应用程序)。此外,依赖对象链接到创建并更新它们的用户。在Django Admin Inline中为非可编辑字段设置初始值
我想按照我的分类管理控制台:
- 类别字段。
- 内联CategoryTranslation对象由现有语言初始化。例如,在我的网站支持俄语和英语的情况下,应该显示2(并且只有2)内联,首先应该具有不可编辑的外语,等于'ru',second - 'en'。
- 在类别保存之后,新的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方法支持汉语语言的数并在表单创建时使用可用语言进行初始化。
更新 我还设置当前用户在save_formset(个体经营,要求,形式,表单集,变化)的方法来FORMSET并利用他来填充更改对象的字段保存()CategoryTranslationFormSet类的方法。
它是正确的吗?
所以现在我需要:
- 制作LANGUAGE_CODE场READ_ONLY(如果我只是把它添加到readonly_fields元组,我将无法在形式上对其进行初始化)。
- 了解,是我的解决方案,在保存正确之前附加用户。