2012-03-13 100 views
1

我的网站支持多种语言。我有一个对象(类别)应该有一个或多个翻译对象(类别翻译)分别支持的语言(他们不是那么简单,所以,请不要建议使用翻译应用程序)。此外,依赖对象链接到创建并更新它们的用户。在Django Admin Inline中为非可编辑字段设置初始值

我想按照我的分类管理控制台:

  1. 类别字段。
  2. 内联CategoryTranslation对象由现有语言初始化。例如,在我的网站支持俄语和英语的情况下,应该显示2(并且只有2)内联,首先应该具有不可编辑的外语,等于'ru',second - '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(个体经营,要求,形式,表单集,变化)的方法来FORMSET并利用他来填充更改对象的字段保存()CategoryTranslationFormSet类的方法。

它是正确的吗?

所以现在我需要:

  1. 制作LANGUAGE_CODE场READ_ONLY(如果我只是把它添加到readonly_fields元组,我将无法在形式上对其进行初始化)。
  2. 了解,是我的解决方案,在保存正确之前附加用户。

回答

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