Django管理页面:在StackedInline / TabularInline中设置默认值

6
我正在创建一个网站,需要支持国际化。默认语言是葡萄牙语、英语和西班牙语。我正在使用django-i18nmodel,目前它的运作非常好。
当管理员想要创建一个产品时,使用django-admin,默认情况下,我会创建3个ProductI18N模型的inLine项。
class LanguageStackedInline(admin.StackedInline):
    model = ProductI18N
    extra = 1

我希望使用上述提到的三种默认语言(pt-PT,en-US,es-ES)创建这三行内容。我知道在模型中只能设置一个默认值。

Django是否提供了一种简单的方法来实现这个目标?

2个回答

8

我要感谢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,所以不能确定。 - user234932

-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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接