У меня есть форма, в которой пользователь выбирает Аэропорт, а затем может выбрать один из терминалов аэропорта (отношение один ко многим через ForeignKey).
Выбор для терминального поля должен быть ограничен терминалами выбранного аэропорта.
Есть ли какой-нибудь распространенный способ реализовать это?
Сейчас я смотрю на библиотеку ajax отфильтрованных полей , но, возможно, есть и другие способы ...
Спасибо Чико! А вот еще одна ссылка для создания атрибута data-parent из модели базы данных:
пользовательские атрибуты при визуализации виджета
Но в моем случае решение для добавления атрибута 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)))
Заполнить словарь терминальных портов при создании формы:
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)