2012-03-13 18 views
1

私のサイトは複数の言語をサポートしています。サポートされている言語に対応する1つまたは複数の翻訳オブジェクト(CategoryTranslation)が必要なオブジェクト(Category)があります(これらは単純ではありませんので、翻訳アプリケーションを使用するためのアドバイスはしないでください)。また、依存オブジェクトには、それらを作成して最後に更新するユーザーへのリンクがあります。Django Adminインラインで編集不可能なフィールドの初期値を設定

私は私のカテゴリーの管理パネルで、次たい:

  1. カテゴリーフィールドを。
  2. Inlined Category既存の言語で初期化された翻訳オブジェクト。たとえば、私のサイトではロシア語と英語をサポートしていますが、2行しか表示されないようにする必要があります。
  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方法は、サポートされているlangaugesのカウントフォームはフォーム作成時に使用可能な言語で初期化されます。

更新 は私もsave_formsetで(自己、リクエスト、フォーム、フォームセット、変化する)方法をフォームセットとCategoryTranslationFormSetクラスのsave()メソッドで変更されたオブジェクトのフィールドを埋めるために彼を使用するために、現在のユーザーを設定します。

正しいですか?

だから今、私は必要があります。

  1. は(私は単にreadonly_fieldsタプルに追加した場合、私は形でそれを初期化することはできません)READ_ONLY LANGUAGE_CODEフィールドを作成します。
  2. を理解してください。保存する前にユーザーを追加するという私の解決策です。

答えて

0

チェックこの1:

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 
関連する問題