Джанго формы: одно поле выбора является подмножеством другого поля выбора.Как динамически изменить подмножество? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть форма, в которой пользователь выбирает Аэропорт, а затем может выбрать один из терминалов аэропорта (отношение один ко многим через ForeignKey).

Выбор для терминального поля должен быть ограничен терминалами выбранного аэропорта.

Есть ли какой-нибудь распространенный способ реализовать это?

Сейчас я смотрю на библиотеку ajax отфильтрованных полей , но, возможно, есть и другие способы ...

Спасибо Чико! А вот еще одна ссылка для создания атрибута data-parent из модели базы данных: пользовательские атрибуты при визуализации виджета

Но в моем случае решение для добавления атрибута data-parent проще:

  1. Унаследовать, выбрать атрибут виджета и добавить новую информацию:

    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)))
    
  2. Заполнить словарь терминальных портов при создании формы:

    airports_queryset=Airport.objects.all()
    airport=forms.ModelChoiceField(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(queryset=terminals_queryset,widget=terminal_select_widget)
    
...