Django Динамический раскрывающийся список из базы данных - PullRequest
8 голосов
/ 26 августа 2009

Я хотел разработать приложение Django, и одна из функций, которые я хотел бы иметь, - это динамические выпадающие списки ... специально для марок автомобилей и моделей ... выбор конкретной марки обновит список моделей только модели, которые подпадают под это, делают .... Я знаю, что это возможно в javascript или jQuery (это был бы мой лучший выбор, если у кого-то есть ответ), но я не знаю, как это сделать.

Кроме того, я бы хотел, чтобы марка, модель, год и серия были общими, а другие атрибуты, такие как цвет, передача и т. Д., Были бы переменными, так что вводить марку, модель, год и серию нужно только для новый автомобиль. Любые идеи будут высоко оценены.

Ответы [ 2 ]

9 голосов
/ 10 сентября 2009

3 вещи, которые вы упоминаете как общие, марка, модель, год, будут 3 входными значениями. При передаче на сервер объект, содержащий детали, будет возвращен на вызывающую страницу. Эта страница будет анализировать детали объекта (используя JavaScript) и обновлять пользовательский интерфейс, чтобы отображать их пользователю.

Со стороны Django должны быть средства, чтобы взять 3 входа и вернуть результат. Со стороны клиента должны быть средства для передачи 3 входных данных на сервер и последующего надлежащего анализа ответа сервера.

Существует DEST-инфраструктура REST для Django, которая позволяет довольно просто добавить упомянутый выше "api" - Piston . Используя Piston, вам просто нужно создать URL для этого ресурса, а затем добавить обработчик для его обработки. (вам все равно нужно просмотреть документацию Piston, но это должно дать вам представление о том, как это выглядит)

urls.py:
vehicle_details = Resource(handler=VehicleDetails)
url(r'^vehicle/(?<make>.*)/(?<model>.*)/(?<year\d{2,4}/(?P<emitter_format>[a-z]{1,4}), vehicle_details, name='vehicle_details'),

handler.py:
class VehicleDetails(BaseHandler):
    methods_allowed = ('GET',)
    model = Vehicles  #whatever your Django vehicle model is

    def read(self, request, *args, **kwargs):
        # code to query the DB and select the options
        # self.model.objects.filter()...            
        # Build a custom object or something to return

        return custom_object

Это просто устанавливает URL www.yoursite.com/vehicle/[make]/[model]/[year]/json, чтобы возвращать пользовательский объект данных в JSON для анализа jquery.

На стороне клиента вы можете использовать jquery для настройки события (связывания), чтобы, когда во всех 3 раскрывающихся списках было выбрано значение, он выполнял $ .get () для URL API. Когда он получает этот результат обратно, он передает его в анализатор Jquery JSON и передает пользовательский объект как объект javascript. Затем этот объект можно использовать для заполнения большего количества выпадающих меню.

(Большое предупреждение, я просто написал следующее на макушке, так что его нельзя копировать и вставлять. Это просто для общей идеи.)

<script type="text/javascript">

    // On document load
    $(function() {
        $('#dropdown_make').bind('change', checkForValues());
        $('#dropdown_model').bind('change', checkForValues());
        $('#dropdown_year').bind('change', checkForValues());
    });

    function checkForValues() {
        if ($('#dropdown_make').val() && $('#dropdown_model').val() && $('#dropdown_year').val())
            updateOptions();        
    }

    function updateOptions() {
        url = '/vehicle/';
        url += $('#dropdown_make').val() + '/';
        url += $('#dropdown_model').val() + '/';
        url += $('#dropdown_year').val() + '/';
        url += 'json/';
        $.get(url, function(){
            // Custom data object will be returned here
        })
    }
</script>

0 голосов
/ 26 августа 2009

Это странно: Поля выбора с динамической фильтрацией с Django

Его вопрос:

"Вот ситуация: у меня есть база данных с марками и моделями автомобилей. Когда пользователь выбирает марку, я хочу обновить раскрывающийся список моделей, используя только модели, связанные с этой маркой. ... Поэтому я хочу использовать Ajax для заполнения данных. "

Ты не тот же парень? :)

...