我正在创建一个网站,它需要国际化支持。默认语言为葡萄牙语,英语和西班牙语。我正在使用django-i18nmodel,到目前为止效果很好。
当管理员想要使用django-admin创建产品时,默认情况下我会创建ProductI18N型号的3个inLine项目。
class LanguageStackedInline(admin.StackedInline):
model = ProductI18N
extra = 1
我想用上面提到的 3 默认语言(pt-PT,en-US,es-ES)创建这3行。我知道在模型中我只能设置一个默认值。
Django提供了一种简单的方法吗?
答案 0 :(得分:4)
我要感谢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
这会为每种非默认语言生成一个表单。它并不完美,因为它没有考虑其中一种非默认语言已经保存的情况,但它给了我一个很好的起点。
答案 1 :(得分:-2)
为内联管理员提供自定义formset类:
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
您可以查看admin和inline formsets上的文档,了解有关自定义的更多说明。