请看一下这个问题:
如何将 ModelForm 与 django-translated-fields 一起使用?
你有什么解决办法吗?
简而言之,我正在尝试将 Speedy Net 从 using 转换django-modeltranslation
为django-translated-fields
. 我定义了模型和表单,一切都用英语工作,但是用另一种语言(希伯来语)我有一个问题,表单字段是用英语而不是希伯来语(当前语言)定义的。我做错了什么,如何定义表格以使用当前语言?(模型中由 TranslatedField 定义的字段应仅在 SpeedyMatchProfileActivationForm 形式的当前语言中可见)。
我想澄清一下,所需的定义与上述不同。所需的定义是使用表单中的当前语言,而不是始终使用英语。当前语言不是英语时使用英语是一个错误。
你可以在这里看到代码:
现在的问题在于类SpeedyMatchProfileActivationForm
(在forms.py中定义)。我认为这主要是因为类是在get_language()
返回任何东西之前定义的。但是当类被定义时django-modeltranslation
(例如在 branch staging中),它就起作用了。
顺便说一句,我想切换到的原因之一django-translated-fields
是因为它在数据库中只定义了 2 个(语言数量)字段,并django-modeltranslation
定义了 3 个字段 - 其中一个(没有任何语言的主要字段)在我看来不是完全有必要。看看:
删除迁移时的原始语言字段
class SpeedyMatchProfileActivationForm
现在定义(带有django-translated-fields
,链接):
class SpeedyMatchProfileActivationForm(forms.ModelForm):
validators = {
'height': [speedy_match_accounts_validators.validate_height],
'smoking_status': [speedy_match_accounts_validators.validate_smoking_status],
'marital_status': [speedy_match_accounts_validators.validate_marital_status],
to_attribute(name='profile_description'): [speedy_match_accounts_validators.validate_profile_description],
to_attribute(name='city'): [speedy_match_accounts_validators.validate_city],
to_attribute(name='children'): [speedy_match_accounts_validators.validate_children],
to_attribute(name='more_children'): [speedy_match_accounts_validators.validate_more_children],
to_attribute(name='match_description'): [speedy_match_accounts_validators.validate_match_description],
'gender_to_match': [speedy_match_accounts_validators.validate_gender_to_match],
'min_age_match': [speedy_match_accounts_validators.validate_min_age_match],
'max_age_match': [speedy_match_accounts_validators.validate_max_age_match],
'diet_match': [speedy_match_accounts_validators.validate_diet_match],
'smoking_status_match': [speedy_match_accounts_validators.validate_smoking_status_match],
'marital_status_match': [speedy_match_accounts_validators.validate_marital_status_match],
}
diet = forms.ChoiceField(choices=User.DIET_VALID_CHOICES, widget=forms.RadioSelect(), label=_('My diet'), validators=[speedy_match_accounts_validators.validate_diet])
photo = forms.ImageField(required=False, widget=CustomPhotoWidget, label=_('Add profile picture'))
class Meta:
model = SpeedyMatchSiteProfile
fields = ('photo', to_attribute(name='profile_description'), to_attribute(name='city'), 'height', to_attribute(name='children'), to_attribute(name='more_children'), 'diet', 'smoking_status', 'marital_status', 'gender_to_match', to_attribute(name='match_description'), 'min_age_match', 'max_age_match', 'diet_match', 'smoking_status_match', 'marital_status_match')
widgets = {
'smoking_status': forms.RadioSelect(),
'marital_status': forms.RadioSelect(),
to_attribute(name='profile_description'): forms.Textarea(attrs={'rows': 3, 'cols': 25}),
to_attribute(name='city'): forms.TextInput(),
to_attribute(name='children'): forms.TextInput(),
to_attribute(name='more_children'): forms.TextInput(),
to_attribute(name='match_description'): forms.Textarea(attrs={'rows': 3, 'cols': 25}),
'diet_match': CustomJsonWidget(choices=User.DIET_VALID_CHOICES),
'smoking_status_match': CustomJsonWidget(choices=SpeedyMatchSiteProfile.SMOKING_STATUS_VALID_CHOICES),
'marital_status_match': CustomJsonWidget(choices=SpeedyMatchSiteProfile.MARITAL_STATUS_VALID_CHOICES),
}
它是以前定义的(带有django-modeltranslation
, link):
class SpeedyMatchProfileActivationForm(TranslationModelForm):
validators = {
'height': [speedy_match_accounts_validators.validate_height],
'min_age_match': [speedy_match_accounts_validators.validate_min_age_match],
'max_age_match': [speedy_match_accounts_validators.validate_max_age_match],
'smoking_status': [speedy_match_accounts_validators.validate_smoking_status],
'city': [speedy_match_accounts_validators.validate_city],
'marital_status': [speedy_match_accounts_validators.validate_marital_status],
'children': [speedy_match_accounts_validators.validate_children],
'more_children': [speedy_match_accounts_validators.validate_more_children],
'profile_description': [speedy_match_accounts_validators.validate_profile_description],
'match_description': [speedy_match_accounts_validators.validate_match_description],
'gender_to_match': [speedy_match_accounts_validators.validate_gender_to_match],
'diet_match': [speedy_match_accounts_validators.validate_diet_match],
'smoking_status_match': [speedy_match_accounts_validators.validate_smoking_status_match],
'marital_status_match': [speedy_match_accounts_validators.validate_marital_status_match],
}
diet = forms.ChoiceField(choices=User.DIET_VALID_CHOICES, widget=forms.RadioSelect(), label=_('My diet'), validators=[speedy_match_accounts_validators.validate_diet])
photo = forms.ImageField(required=False, widget=CustomPhotoWidget, label=_('Add profile picture'))
class Meta:
model = SpeedyMatchSiteProfile
fields = ('photo', 'profile_description', 'city', 'height', 'children', 'more_children', 'diet', 'smoking_status', 'marital_status', 'gender_to_match', 'match_description', 'min_age_match', 'max_age_match', 'diet_match', 'smoking_status_match', 'marital_status_match')
widgets = {
'profile_description': forms.Textarea(attrs={'rows': 3, 'cols': 25}),
'children': forms.TextInput(),
'more_children': forms.TextInput(),
'smoking_status': forms.RadioSelect(),
'marital_status': forms.RadioSelect(),
'match_description': forms.Textarea(attrs={'rows': 3, 'cols': 25}),
'diet_match': CustomJsonWidget(choices=User.DIET_VALID_CHOICES),
'smoking_status_match': CustomJsonWidget(choices=SpeedyMatchSiteProfile.SMOKING_STATUS_VALID_CHOICES),
'marital_status_match': CustomJsonWidget(choices=SpeedyMatchSiteProfile.MARITAL_STATUS_VALID_CHOICES),
}
谢谢!