Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置Django管理内联中不可编辑字段的初始值_Django_Django Admin_Inline Formset - Fatal编程技术网

设置Django管理内联中不可编辑字段的初始值

设置Django管理内联中不可编辑字段的初始值,django,django-admin,inline-formset,Django,Django Admin,Inline Formset,我的网站支持多种语言。我有一个对象(类别),应该有一个或多个翻译对象(CategoryTranslation),分别对应于支持的语言(它们不是那么简单,所以,请不要建议使用翻译应用程序)。此外,从属对象具有指向创建和上次更新它们的用户的链接 我想在我的类别管理面板中显示以下内容: 类别字段 由现有语言初始化的内联CategoryTranslation对象。例如,在我的站点支持俄语和英语的情况下,应该显示2条(并且只有2条)内联线,第一条内联线的不可编辑字段语言应等于“ru”,第二条内联线为“en

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

我想在我的类别管理面板中显示以下内容:

  • 类别字段
  • 由现有语言初始化的内联CategoryTranslation对象。例如,在我的站点支持俄语和英语的情况下,应该显示2条(并且只有2条)内联线,第一条内联线的不可编辑字段语言应等于“ru”,第二条内联线为“en”
  • 类别保存后,新类别翻译应按等于当前用户的字段值创建,已编辑类别翻译应按等于当前用户的字段值编辑
  • 以下是我目前所做的:

    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()方法中填充已更改对象的字段

    对吗

    所以现在我需要:

  • 使语言代码字段为只读(如果我只是将其添加到只读字段元组中,我将无法在表单中初始化它)
  • 请理解,我的解决方案是在保存正确之前追加用户
  • 勾选这个:

    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