2012-03-13 97 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