Динамический выбор страны / города в Джанго: как разрешить использование значения поля из набора запросов в поле модели? - PullRequest
0 голосов
/ 20 мая 2011

У меня проблема с 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 делает страницу действительно медленной (и непригодной для использования)!

Заранее большое спасибо!

1 Ответ

0 голосов
/ 20 мая 2011

Рад, что вы решили свою проблему.На случай, если с кем-то еще случится, Django создает проверку для селектов против choices, переданного во время инстанцирования.Если вы собираетесь выполнять AJAX-фильтрацию выбора, ваш choices в отношении Django должен быть любым допустимым выбором, нефильтрованным.Используйте javascript, чтобы делать выбор по своему усмотрению после отображения страницы.

...