我正在创建一个网站,它需要国际化的支持。默认语言是葡萄牙语,英语和西班牙语。我正在使用django-i18nmodel,到目前为止效果很好。
当管理员想要使用django-admin创建产品时,默认情况下,我会创建3个型号为ProductI18N的内联项。
class LanguageStackedInline(admin.StackedInline): model = ProductI18N extra = 1
我想用上面提到的3种默认语言(pt-PT,en-US,es-ES)创建这3行。我知道在模型中我只能设置默认值。
Django是否提供一种简便的方法?
我要感谢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
每种非默认语言都会生成一种形式。它不是完美的,因为它没有考虑已经保存一种非默认语言的情况,但这为我提供了一个很好的起点。