AngularJS - как изменить значение внутренней переменной Python из функции внешнего интерфейса AngularJS? - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я работаю над веб-приложением, для которого внутренняя часть была разработана с использованием Django & Python, а внешняя часть была разработана с использованием AngularJS.

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

Все данные, записанные во внутренней части, являются «чувствительными ко времени», ив настоящее время в бэкэнде установлен только один часовой пояс (UTC).Я хочу «создать» настройки для добавления нескольких новых часовых поясов, чтобы записанные данные можно было экспортировать в разные часовые пояса.

Часовой пояс установлен в project / apps / appAbc / abc / settings.pyс помощью:

class Production(Settings):
    ...
    TIME_ZONE = 'UTC'
    ...

Форма «Экспорт» имеет несколько полей (предустановка, тип данных, сортировка данных по количеству / периоду, тип файла для экспорта), и я только что добавил «Часовой пояс»в раскрывающемся списке:

<section class="panel panel-brand export-page panel-no-border-radius">
<div class="panel-body panel-body-fixed-md">
    ...
    <div class="divider"></div>
    <div class="row">
        <label data-i18n="Timezone:" class="col-sm-3"></label>
        <div ul-timezone-picker callback="selectTimezone" class="col-sm-9" default-label={{presetTimezone}} btn-class="btn-xs btn-default"></div>
    </div>
    <div class="divider"></div>
    <div class="row" ul-scroll-to-me="scrollToFtype">
        <label data-i18n="File type:" class="col-sm-3"></label>
        <div ul-options-menu class="col-sm-9" options="ftypeOptions"
             callback="selectFType" warning="{{ftypeWarning}}"
             btn-class="btn-xs btn-default" default-idx="0" default-label="{{presetFtype}}"></div>
    </div>
    <div class="divider divider-lg"></div>
    <div class="row">
        <div class="col-sm-4"></div>
        <div class="col-sm-4">
            <button class="btn btn-sm btn-block btn-brand" ng-hide="!btnDisabled" ng-click="setDownloadUrl(true)">
                <i class="ti-export"></i>
                <span data-i18n="Export"></span>
            </button>
            <a class="btn btn-sm btn-block btn-brand" role="button" target="_blank" href="{{downloadURL}}" ng-hide="btnDisabled">
                <i class="ti-export"></i>
                <span data-i18n="Export"></span>
            </a>
        </div>
    </div>
</div>

и в Pages / directive.js я добавил несколько часовых поясов для контроллера ulTimezonePicker:

.directive('ulTimezonePicker', function() {
    return {
        ...
        controller: function ($scope) {
            $scope.options = [{label: 'UTC', value: 0},
            // Add in other timezones
            {label: 'GMT', value: 1},
            {label: 'BST', value: 2},
        ];
        ...
    ...
})

Функция selectTimezone(), вызываемая полем ul-timezone-picker в форме, определяется в проекте / libs / front / app / scripts / app / pages / exportCtrl.js с помощью:

angular.module('app.pages').controller('ExportCtrl',
    function(...) {
        ...
        $scope.selectTimezone = function(option){
            if(option) {
                $scope.timezone = option;
                if(option.label != $scope.presetTimezone) {
                    $scope.presetTimezone = undefined;
                }
            }
        };
    ...
    }
}

Итак,у меня вопрос: как заставить функцию selectTimezone() фактически изменить значение переменной TIME_ZONE, определенной в settings.py?

Я попытался объявить экземпляр переменной внутри функции с помощью:

Production.TIME_ZONE = $scope.timezone;

Но когда я делаю это, и просматриваю страницу, на которой есть форма в бровиser, консоль браузера выдает мне сообщение об ошибке:

ReferenceError: Производство не определено

Как я могу получить этот класс Python из функции AngularJS, чтобы изменить значение одной из ее переменных?

1 Ответ

0 голосов
/ 01 июня 2018

Вы не общаетесь с классами Python из AngularJS.Ваше приложение Python и приложение Angular - это две отдельные программы, которые даже не работают на одном компьютере.

Задача здесь состоит в том, чтобы изобрести «язык», с которым эти две программы могут общаться.Существует множество способов разработки такого языка, HTTP - отличный выбор по умолчанию.

Ваш бэкэнд использует Django, а Django довольно хорошо разбирается в HTTP-запросах и отвечает на них.Потратьте день или два на изучение учебника по Django, выясните, как создать приложение Django, а затем подумайте, какую конечную точку HTTP должно обрабатывать ваше приложение.Добавьте его в свой бэкэнд, немного протестируйте, затем перейдите в приложение Angular.

Осторожно - приложения Django обычно не полагаются на глобальное состояние, хранящееся в классе, подобном class Production, ивместо этого сохраняйте состояние в базах данных.

Как только у вас будет готовый бэкэнд, используйте Angular $http service для отправки запросов на адрес, который вы только что добавили.

Я немного расплывчатый (извините), но я предполагаю, что вы новичок в Django на данный момент, и учебник будет более полезным, чем я мог бы быть.Удачи!

...