20 개가 넘는 필드가있는 기본 폼이 있습니다. 그런 다음이 폼에서 상속받은 약 15 개의 다른 폼이 있는데, 기본 폼이 다른 모든 필드를 삭제하는 데 사용하는 필드라는 매개 변수를 전달합니다. 좋은 예를 통해 설명 :Django 양식 필드 레이블 번역
class BaseForm(forms.Form):
reportid = forms.HiddenInput()
fromdate = forms.DateField(label=_("From"), widget=widgets.AdminDateWidget())
todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
sort_by = forms.ChoiceField(label=_("Sort by"), choices=[])
.......
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields')
#Pseudo:
***del self.fields[field] for field not in fields***
class SubForm(forms.Form):
def __init__(self, *args, **kwargs):
fields = ['reportid', 'todate']
super(SubForm, self).__init__(fields=fields, *args, **kwargs)
결과 형식은 다음과 같을 것이다 :
class SubForm(forms.Form):
reportid = forms.HiddenInput()
todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
내 문제는 BaseForm가 처음 초기화 될 때, 레이블을 함께 필드에 바인딩 된 것입니다 (또는 현재 사용자가 언어를 변경하는 경우) 필드 레이블이 업데이트되지 않습니다.
내가 이런 딕셔너리 사용하여 솔루션에 왔어요 : 모든 필드 통해 반복 baseform를 초기화하고
self.fields[field].widget.label = labels[field]()
내가 어떤 더 좋은이 있습니까 설정할 때 다음
labels = {
'todate': lambda: _("To"),
'fromdate': lambda: _("From"),
.....
}
과 (읽기 : 더 pythonic) 이것을 달성하는 방법?
이 필드를 번역하기위한 ugettext_lazy 사용하십니까에서 세부 사항을 문서화? –
@Krzysztof : 물론! 그건 꽤 바보 같았어요, 나는 ugettext_lazy 대신 ugettext를 가져 왔습니다 ... 당신이 대답으로 당신의 코멘트를 올리면 받아 들일 것입니다;) –