Цель этой части приложения - вывод отчетов (таблиц) из базы данных. Пользователем предварительно загружается архив с каталогом определенной структуры содержащий файлы dbf, нужные данные из которого потом конвертируются в другой формат (использую postgres). Один каталог - это одна база данных по конкретному арендатору (точнее по арендуемому лесному участку) из другой программы. Таких каталогов пользователь может загружать несколько штук, т.е. у каждого каталога (арендатора) в новой бд свой id, который позволяет его идентифицировать данные по нему.
Пока в этой части приложения у меня 3 вьюхи:
1. Здесь пользователю предоставляется возможность выбрать ту часть данных по арендатору (database), по которым он хочет получить отчет. В форме 2 SelectField - выбор арендатора и выбор отчета (значение value отчета совпадает с названием вьюхи, на которую потом будет производиться редирект).
@other_tasks.route('/other_tasks/choose_task', methods=['GET', 'POST'])
@login_required
def choose_task():
user = current_user._get_current_object()
form = forms.TaskForm(user=user)
if form.is_submitted():
database = Database.query.get_or_404(form.database.data)
view_func = form.task.data
return redirect(url_for('other_tasks.{}'.format(view_func),
database_id=database.id))
return render_template('other_tasks/task_choice.html', form=form)
class TaskForm(Form):
database = SelectField('Укажите целевую базу данных', coerce=int)
task = SelectField('Выберите задачу', choices=[
('calculate_characteristic_table', 'Характеристика лесных насаждений')])
submit = SubmitField('Отправить')
def __init__(self, user, *args, **kwargs):
super(TaskForm, self).__init__(*args, **kwargs)
self.database.choices = [(database.id, database.name)
for database in user.databases.all()]
2. Во второй я через форму уточняю некоторые данные, необходимые уже для выбранного отчета и затем произвожу расчеты с использованием предварительно написанных классов. На каждый отчет будет своя вьюха. Конкретно для этого отчета в форме всего одно поле BooleanField (которое пока не используется), для других будет больше. Полученный результат я хочу отобразить для просмотра, поэтому после сабмита формы, получения уточняющих данный и вычислений, делаю редирект на третью вьюху, в которую хочу передать словарь с результатом.
other_tasks.route('/other_tasks/handle_table/<int:database_id>',
methods=['GET', 'POST'])
@login_required
def calculate_characteristic_table(database_id):
database = Database.query.get_or_404(database_id)
user = current_user._get_current_object()
if database not in user.databases:
abort(403)
form = forms.LeaseCharacteristicForm()
if form.is_submitted():
details = form.details.data
table = tables.LeaseCharacteristicTable(database)
table.get_lease()
result = table.lease_dict
# TODO: next line seems wrong, because I join result to URL
return redirect(url_for('other_tasks.check_table',
result=json.dumps(result)))
return render_template('other_tasks/details.html', form=form)
3. Отображение результата (таблицы с отчетом)
@other_tasks.route('/check_table/<result>')
@login_required
def check_table(result):
result = json.loads(result)
return render_template('other_tasks/view_result.html', result=result)
4kpt_IV
Смотрите. Редирект делается в том случае, когда данные формы валидны. Изменяются данные в системе или БД и делается редирект на get.
Поправил form.validate_in_submit() на form.is_submitted(), потому как в этих формах используются только SelectField и BooleanField. Данные не изменяются, а только считываются