Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2020 08:18:10

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

Здравствуйте. Есть шаблон с таблицей. Мне нужно во view обработать выбранную строку таблицы. Можно, конечно, передать id этой строки, но не хочется делать лишний запрос к базе, когда нужные данные уже в таблице. Можно ли передать нужную строку в виде словаря? Типа

 one_row={"id":123,"name":"колесо","price":321}
 <a href="{% url 'edit_row'  one_row %}"><span class="btn btn-default glyphicon glyphicon-pencil"></span></a>
 def edit_row(request,one_row):
<обрабатываем, получаем результат>
return render(request, 'my_table.html', {"rez": rez})
 urlpatterns = [
    path('program/edit/<dict:one_row>', views.edit_row, name='edit_row'),]

Офлайн

#2 Сен. 4, 2020 10:50:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

передать словарь в GET

1) Вопрос не вполне понятен. Что значит “передать строку в виде словаря”? Стрку можно передать как строку . Вероятно вы имели в виду запись базы данных, но тут возникает вопрос 2
2) Собственно GET запрос это и есть словарь по структуре, свойствам и поведению. Смотрите:

https://www.linux.org.ru/forum/general/15883443?cid=15883457
это и есть пара ключ-значение, то есть разница только в синтаксисе
 {'cid': 15883457}  # это то же самое
3) Решение на первый взгляд кажется оооооочень ненадежным. Вообще, лучше бы вам дать больше информации о вашей артитектуре, потому что есть подозрение, что вы собираетесь выстрелить себе в ногу.
3.1) <обрабатываем, получаем результат> Очень сильно зависит от того, как именно вы что-то обрабатываете. Самый безобидный случай, когда ваша обработка это чистая функция. читать Но в этом случае немедленно возникает вопрос, а зачем это вообще выносить в бэкенд. Нельзя ли весь расчет реализовать на клиенте и не гонять бессмысленные данные по сети. Если функция не чистая, то
3.2) Менее безобидный случай, когда обработка не подразумевает записи в БД, только чтение. В этом случае, ваша ссылка рано или поздно устареет. То есть данные, которые вы зашифровали в ссылке перестанут быть актуальными. Допустим, у вас есть таблица
id       | Имя города | Население
1 | Москва | 20 000 000
1254 | Сосновка | 1058
и вы прихранили в ссылке
< a href='http://my_site/page?city_id=1254&population=1058'>
Сама природа ссылки запрещает делать такие вещи, потому что ссылку можно сохранить в истории браузера, сохнанить в избранном, передать по имейлу, ссылки сохраняются в индексе поисковиков, в веб-архивах и так далее. То есть в какой то момент ваш бэкенд начнет обрабатывать заведомо неверные данные. В вашей базе уже 1057 жителей (дадя Илья помер вчера и данные изменились), но переход по ссылке в лучшем случае выдаст устаревшие данные, а в плохом ваша логик арасчета вообще сломается и клиент получит какую-нибудь ерунду. Это может произойти например, если у вас есть скажем таблица процентного соотношения полов в городе. И при запросе вы эти данные считываете из БД. И вот у вас часть данных для обработки новые, а часть страрые. И результат вы получите дурацкий. Но самое страшное это если
3.3) Этот запрос изменяет состояние БД. Вот тут вам надо бить по рукам сразу, потому что есть даже не золотое, а бриллиантовое правило любого сетевого приложения - никогда не доверяй клиенту.

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



Отредактировано FishHook (Сен. 4, 2020 10:51:57)

Офлайн

#3 Сен. 4, 2020 12:13:23

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

спасибо, что ответили! Я совсем начинающий, прошел пока только пару уроков (https://developer.mozilla.org и https://tutorial.djangogirls.org), решил сделать простенький сайт (в приложении).
Справа sidebar с формой, которая отображается при передаче id>=0 (сейчас там -1), слева форма-заголовок с выбранным полем для сортировки и поиском по нему и полем строки поиска. Ниже-таблица с данными. Для каждой записи 2 псевдокнопки (я выше писал).
Идея-не создавая класс формы (как я понял, ее нельзя впихнуть в sidebar, а мне это надо, потому что при создании или редактировании записи приходится сравнивать с уже имеющимися строками таблицы), получить данные о нужной записи+данные из формы-заголовка, чтобы после перерисовывания страницы у меня не сбросился сделанный выбор.
Сама таблица рисуется в отдельной функции, в которую передаются выбранное поле+строка поиска, а функция возвращает словарь со строками таблицы. Вся страница создается

 return render(request, 'artikuls/art_tab.html', {"arts": rez, "dop": dop_rez})
, где rez содержит содержимое страницы, а dop - все прочее (в частности, содержимое заголовка и формы редактирования в sidebar'е).
POST будет посылаться при сохранении этой формы, там, возможно, и не важно будет, как выглядела таблица (во всяком случае, пока меня это не волнует). Так вот, передать в функцию из таблицы я могу только id. Была мысль в каждую строку таблицы вписывать нужную пару поле-строка поиска из формы-заголовка, но такой идиотизм даже мне не понравился, тем более, что тогда, по логике, в адрес придется передавать еще и поля редактируемой строки.
Да бес с ними, полями строки, сделаю я лишний запроос, но вот как запомнить аргументы из верхней формы-не знаю. Хотел воспользоваться сессией, но она у меня почему-то не работает. Что-то с MySQL

Прикреплённый файлы:
attachment pic.png (53,9 KБ)

Офлайн

#4 Сен. 4, 2020 12:40:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

передать словарь в GET

Я честно говоря запутался что именно вы хотите сделать. Давайте по-порядку. Вопрос первый. Зачем вам нужна форма слева, там где написано “тут будет форма”, что эта форма должна передавать на сервер?



Офлайн

#5 Сен. 4, 2020 12:48:41

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

там будет редактироваться имеющаяся запись или создаваться новая. На скриншоте была нажата кнопка “+” для создания новой записи (таблица не изменилась, потому что эта кнопка-в форме, из которой request.GET может получить данные о фильтрации таблицы)

Прикреплённый файлы:
attachment pic1.png (53,4 KБ)

Офлайн

#6 Сен. 4, 2020 12:51:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

передать словарь в GET

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



Офлайн

#7 Сен. 4, 2020 13:29:13

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

1) данные о фильтрации хранятся в форме-заголовке, а кнопка, посылающая POST-запрос-в форме sidebar'а. Это разные формы
2) при сознании формы для ввода новой записи нажимается кнопка из формы-заголовка и, поэтому таблица перерисовывается согласно условий фильтрации (они хранятся в этой форме).
3) при попытке открыть в форме sidebar'а реальную строку таблицы, я не могу передать в функцию, выбирающую содержимое этой таблицы, условия, с которыми она была на момент нажатия кнопки, отфильтрована. И у меня она отображается вообще без фильтрации. Картинку могу приложить, просто сейчас там все закомментировано, не работает

Офлайн

#8 Сен. 4, 2020 14:01:58

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

вот картинки. Открываю вторую строку и получаю эту строку сбоку и совершенно не ту информацию в таблице

Прикреплённый файлы:
attachment pic2.png (40,6 KБ)

Офлайн

#9 Сен. 4, 2020 14:02:20

mokynis
Зарегистрирован: 2020-06-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

передать словарь в GET

картинки отправляются только по одной

Отредактировано mokynis (Сен. 4, 2020 14:08:13)

Прикреплённый файлы:
attachment pic3.png (53,7 KБ)

Офлайн

#10 Сен. 4, 2020 14:20:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

передать словарь в GET

mokynis
данные о фильтрации хранятся в форме-заголовке, а кнопка, посылающая POST-запрос-в форме sidebar'а. Это разные формы
обе формы генерируются вашим бэкендом, то есть джангой, засуньте в action обеих форм одинаковую ссылку



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version