2011-09-29 40 views
10

Tôi có một biểu mẫu cơ sở với hơn 20 trường. Sau đó, tôi có khoảng 15 hình thức khác kế thừa từ biểu mẫu đó, chuyển vào một tham số được gọi là các trường mà biểu mẫu cơ sở sử dụng để xóa tất cả các trường khác. giải thích tốt nhất thông qua ví dụ:Bản dịch nhãn trường biểu mẫu 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) 

Dạng kết quả sau đó sẽ trông như thế này:

class SubForm(forms.Form): 
    reportid = forms.HiddenInput() 
    todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget()) 

Vấn đề của tôi là khi BaseForm được khởi tạo lần đầu tiên, các nhãn đang bị ràng buộc để các lĩnh vực với ngôn ngữ đang hoạt động và khi người dùng khác đăng nhập bằng cài đặt ngôn ngữ khác (hoặc người dùng hiện tại thay đổi ngôn ngữ) nhãn trường không cập nhật.

Tôi đã đi đến một giải pháp sử dụng một dict như thế này:

labels = { 
    'todate': lambda: _("To"), 
    'fromdate': lambda: _("From"), 
    ..... 
} 

và sau đó khi khởi tạo baseform lặp qua tất cả các lĩnh vực và thiết lập

self.fields[field].widget.label = labels[field]() 

Tôi có bất kỳ đẹp hơn (đọc : nhiều hơn pythonic) cách để đạt được điều này?

+3

Bạn có sử dụng ugettext_lazy để dịch các lĩnh vực? –

+1

@Krzysztof: Tất nhiên! Đó là khá ngu ngốc, tôi đã nhập ugettext thay vì ugettext_lazy ... Nếu bạn sẽ đăng nhận xét của mình dưới dạng câu trả lời, tôi sẽ chấp nhận nó;) –

Trả lời

Các vấn đề liên quan