【问题标题】:Django Admin: Default values in StackedInline / TabularInlineDjango Admin:StackedInline / TabularInline 中的默认值
【发布时间】:2013-12-02 22:53:00
【问题描述】:

我正在创建一个网站,它需要国际化支持。默认语言为葡萄牙语、英语和西班牙语。我正在使用 django-i18nmodel,到目前为止效果很好。

当管理员想要创建产品时,使用 django-admin,默认情况下我会创建模型 ProductI18N 的 3 个内联项。

class LanguageStackedInline(admin.StackedInline):
    model = ProductI18N
    extra = 1

我想用我上面提到的 3 种默认语言(pt-PT、en-US、es-ES)创建这 3 行。我知道在模型中我只能设置一个默认值。

Django 是否提供了一种简单的方法来做到这一点?

【问题讨论】:

    标签: python django django-models django-admin django-i18n


    【解决方案1】:

    感谢 uranusjr 为我提供了有关此解决方案的提示。他的回答对我不起作用,但这是有效的:

    class LanguageInlineFormSet(BaseInlineFormSet):
        def __init__(self, *args, **kwargs):
            kwargs['initial'] = [
                {'name': 'pt-PT'}, {'name': 'en-US'}, {'name': 'es-ES'}
            ]
            super(LanguageInlineFormSet, self).__init__(*args, **kwargs)
    
    # Rest of the code as per @uranusjr's answer
    class LanguageStackedInline(admin.StackedInline):
        model = ProductI18N
        extra = 3    # You said you need 3 rows
        formset = LanguageInlineFormSet
    

    为了便于比较,我保留了'name' 键。

    为了更详细地解释,BaseInlineFormSet 采用initial 参数,如下所述:

    https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets-initial-data

    因此,只需在重载的构造函数中将其添加到 kwargs 即可。

    编辑:让我也分享一下我在应用程序中实际使用的代码:

    from django.conf import settings
    from django.forms.models import BaseInlineFormSet
    
    from myapp.models import MyI18N
    
    class MyI18NInlineFormset(BaseInlineFormSet):
        def __init__(self, *args, **kwargs):
            kwargs['initial'] = [{'i18n_language': lang[0]}
                                 for lang in settings.LANGUAGES
                                 if lang[0] != settings.LANGUAGE_CODE]
            super(MyI18NInlineFormset, self).__init__(*args, **kwargs)
    
    class MyI18NInline(admin.StackedInline):
        model = MyI18N
        extra = max_num = len(settings.LANGUAGES) - 1
        formset = MyI18NInlineFormset
    

    这会为每种非默认语言生成一个表单。它并不完美,因为它没有考虑到已经保存了一种非默认语言的情况,但它给了我一个很好的起点。

    【讨论】:

    • 答案是几年前发布的,所以可能同时 API 发生了变化。我不再使用 Django,所以我不能确定。
    【解决方案2】:

    为内联管理员提供自定义表单集类:

    from django.forms.models import BaseInlineFormSet
    
    class LanguageInlineFormSet(BaseInlineFormSet):
        def __init__(self, *args, **kwargs):
            super(LanguageInlineFormSet, self).__init__(*args, **kwargs)
    
            # Assuming the field you want to populate to is called "name"
            self.initial = [
                {'name': 'pt-PT'}, {'name': 'en-US'}, {'name': 'es-ES'}
            ]
    
    class LanguageStackedInline(admin.StackedInline):
        model = ProductI18N
        extra = 3    # You said you need 3 rows
        formset = LanguageInlineFormSet
    

    您可以查看admininline formsets 上的文档,了解有关自定义的更多说明。

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多