2011-09-29 3 views
10

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) 이것을 달성하는 방법?

+3

이 필드를 번역하기위한 ugettext_lazy 사용하십니까에서 세부 사항을 문서화? –

+1

@Krzysztof : 물론! 그건 꽤 바보 같았어요, 나는 ugettext_lazy 대신 ugettext를 가져 왔습니다 ... 당신이 대답으로 당신의 코멘트를 올리면 받아 들일 것입니다;) –

답변

관련 문제