Форма Django использует набор запросов в конструкторе, как воссоздать форму, когда я меняю язык сайта? - PullRequest
1 голос
/ 05 марта 2012

Я создаю форму, которая позволяет пользователю выбирать аэропорт, а затем динамически ограничивает выбор терминала аэропорта.На странице это выглядит так:

Airport: 
<select name="address_form-0-airport" id="id_address_form-0-airport">
<option value="" selected="selected">---------</option>
<option value="10">Sheremetyevo</option>
<option value="11">Bykovo</option>
<option value="12">Vnukovo</option>
<option value="13">Domodedovo</option>
</select></br>

Terminal: 
<select name="address_form-0-terminal" id="id_address_form-0-terminal">
<option data-parent="-" value="" selected="selected">---------</option>
<option data-parent="Sheremetyevo" value="30">Terminal B</option>
<option data-parent="Sheremetyevo" value="31">Terminal C</option>
<option data-parent="Sheremetyevo" value="32">Terminal D</option>

Для создания выбора терминала я наследую виджет Select.Он использует словарь {терминал: аэропорт} для отображения параметров с атрибутом data-parent, который является именем аэропорта:

class TerminalSelect(forms.Select):
    terminal_ports={}

    def render_option(self, selected_choices, option_value, option_label):
        if option_label in self.terminal_ports.keys():
            airport=self.terminal_ports[option_label]
        else:
            airport="-"
        option_value = force_unicode(option_value)
        selected_html = (option_value in selected_choices) and u' selected="selected"' or ''
        return u'<option data-parent="%s" value="%s"%s>%s</option>' % (
            airport, escape(option_value), selected_html,
            conditional_escape(force_unicode(option_label)))

А вот код формы, где поле является объявленным и создается словарь {терминал: аэропорт}:

class AdvancedAddressForm(Form):        
    airports_queryset=Airport.objects.all()
    airport=forms.ModelChoiceField(required=False,queryset=airports_queryset)    
    terminals_queryset=AirportTerminal.objects.all()
    terminal_ports={}
    for terminal in terminals_queryset:            terminal_ports[force_unicode(terminal.name)]=force_unicode(terminal.airport.name)
    terminal_select_widget=TerminalSelect()    
    terminal_select_widget.terminal_ports=terminal_ports
    terminal=forms.ModelChoiceField(required=False,queryset=terminals_queryset,widget=terminal_select_widget)

Работает, пока я не поменяю язык.Когда я меняю язык, названия аэропортов меняются в форме, но словарь {терминал: аэропорт} остается неизменным.Как это исправить?

1 Ответ

1 голос
/ 05 марта 2012

Проблема в том, что вы ничего не делаете в «конструкторе». Вы делаете все во время определения класса.

Вся эта логика должна идти внутри __init__ метода вида:

class AdvancedAddressForm(Form):        
    airports_queryset = Airport.objects.all()
    airport = forms.ModelChoiceField(required=False, queryset=airports_queryset)    
    terminals_queryset = AirportTerminal.objects.all()
    terminal = forms.ModelChoiceField(required=False, queryset=terminals_queryset)

    def __init__(self, *args, **kwargs):
        super(AdvancedAddressForm, self).__init__(*args, **kwargs)
        terminal_ports = {}
        for terminal in self.fields['terminal'].queryset:
            terminal_ports[force_unicode(terminal.name)] = force_unicode(terminal.airport.name)
        terminal_select_widget = TerminalSelect()    
        terminal_select_widget.terminal_ports = terminal_ports
        self.fields['terminal'].widget = terminal_select_widget
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...