1

我的网站支持多种语言。我有一个对象 (Category),它应该有 1 个或多个翻译对象 (CategoryTranslation) 对应于支持的语言(它们不是那么简单,所以请不要建议使用翻译应用程序)。此外,依赖对象具有指向创建和最后更新它们的用户的链接。

我想在我的类别管理面板中关注:

  1. 类别字段。
  2. 由现有语言初始化的内联 CategoryTranslation 对象。例如,在我的站点支持俄语和英语中,应该显示 2 个(并且只有 2 个)内联,首先应该有不可编辑的字段语言等于 'ru',第二个 - 'en'。
  3. 分类保存后,新的 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(self, request, form, formset, change) 方法中将当前用户设置为 formset,并使用他在 CategoryTranslationFormSet 类的 save() 方法中填充更改对象的字段。

这是对的吗?

所以现在我需要:

  1. 使 language_code 字段为只读(如果我只是将其添加到 readonly_fields 元组,我将无法在表单中对其进行初始化)。
  2. 了解,是我在保存正确之前添加用户的解决方案。
4

1 回答 1

0

检查这个:

from django.forms.widgets import HiddenInput

def _construct_form(self, i, **kwargs):
    form = super(CategoryTranslationFormSet, self)._construct_form(i, **kwargs)
    form.empty_permitted = False # Force the translation

    if 'language_code' not in form.initial.keys():
        form.initial['language_code'] = settings.LANGUAGES[i][0]

    for k in form.fields.keys():
        lang = LANG_CHOICES[zip(*settings.LANGUAGES)[0].index(form.initial['language_code'])][1]
        if k == 'language':
            form.fields[k].widget = HiddenInput()
            form.fields[k].label = u'%s %s' % (form.fields[k].label, lang)
        else:
            form.fields[k].label = u'%s (%s)' % (form.fields[k].label, lang)                

    return form
于 2013-05-07T20:19:24.470 回答