У меня проблема с Django, я пытаюсь создать очень простую вещь (позор мне ...): я хочу отфильтровать ForeignKey ModelField, используя другой SelectField (с Ajax, например: поле выбора «Страна» автозаполнение поля выбора «Город», чтобы пользователь мог выбрать свой город).
Мои модели выглядят так:
class Country(models.Model):
...
class Town(models.Model):
country = models.ForeignKey(Country)
...
class Person(models.Model):
user = models.ForeignKey(User, unique=True)
town = models.ForeignKey(Town, related_name='persons')
...
правый.
Теперь мне нужна форма для создания / обновления человека, позволяющая пользователю установить город в поле выбора , отфильтрованное по значению другого окна выбора (Страна).
Вот форма, которую я создал:
class LazyChoiceField(forms.ChoiceField):
def __init__(self, required=True, widget=None, label=None,
initial=None, help_text=None, *args, **kwargs):
super(LazyChoiceField, self).__init__(required=required, widget=widget,
label=label, initial=initial,
help_text=help_text, *args, **kwargs)
def valid_value(self, value):
return True
class PersonForm(ModelForm):
country = ModelChoiceField(queryset=Country.objects.all())
town = LazyChoiceField(choices=[('0', "Chose a country firts!")])
class Meta:
model = Person
exclude = ('user', 'town', )
widgets = {
'country': forms.Select(attrs={'onchange':'get_towns();'}),
}
Работает (предоставляет файл ajax.py, обслуживает функцию get_towns (), вызываемую через Ajax скриптом Jquery + немного JS-содержимого на странице шаблона). Но я не очень доволен этим способом: исключая поле города и добавляя другой город, LazyChoiceField не кажется СУХИМ, не так ли?
Мой вопрос: можно ли сказать Django не генерировать ошибку проверки в ModelField, когда выбранное значение отсутствует в исходном наборе запросов (на самом деле, я не могу отобразить тысячи городов в форме!).
Эта функция (выбор страны / города) очень популярна в Интернете, но мне не удалось найти простой фрагмент Django, чтобы сделать такую вещь. Что вы думаете о решении, которое я пытаюсь разработать? Как сделать это лучше и следуя принципу СУХОЙ?
Если я не исключаю город из ModelForm, мой блок выбора города 30000 делает страницу действительно медленной (и непригодной для использования)!
Заранее большое спасибо!