5

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

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

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

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

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

4

2 回答 2

6

我要感谢 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

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

于 2013-12-11T23:06:42.760 回答
-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

您可以查看有关管理内联表单集的文档,以获取有关自定义的更多说明。

于 2013-12-03T02:57:40.567 回答