Найти - Пользователи
Полная версия: передать словарь в GET
Начало » Django » передать словарь в GET
1 2
mokynis
Здравствуйте. Есть шаблон с таблицей. Мне нужно во 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'),]
FishHook
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) Этот запрос изменяет состояние БД. Вот тут вам надо бить по рукам сразу, потому что есть даже не золотое, а бриллиантовое правило любого сетевого приложения - никогда не доверяй клиенту.

В общем, кажется, я повторяю кажется, что ваше решение плохое. Нужно больше информации. А еще мне кажется, что вы решаете проблему, которая давно уже решена, это называется кеширование данных, но я могу ошибаться. Можем продолжить разбор полетов, если вы сообщите какую именно задачу вы пытаетесь таким образом решить.
mokynis
спасибо, что ответили! Я совсем начинающий, прошел пока только пару уроков (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
FishHook
Я честно говоря запутался что именно вы хотите сделать. Давайте по-порядку. Вопрос первый. Зачем вам нужна форма слева, там где написано “тут будет форма”, что эта форма должна передавать на сервер?
mokynis
там будет редактироваться имеющаяся запись или создаваться новая. На скриншоте была нажата кнопка “+” для создания новой записи (таблица не изменилась, потому что эта кнопка-в форме, из которой request.GET может получить данные о фильтрации таблицы)
FishHook
mokynis
Ну так и ОК, создание или изменение данных это POST запрос, ваши параметры фильтрации хранятся в ссылке, и таким образом при передаче POST запроса по той же ссылке, вы не измените и не сбросите фильтры. То есть пока вы не делаете ГЕТ запросов ваши фильтры не изменяются.
mokynis
1) данные о фильтрации хранятся в форме-заголовке, а кнопка, посылающая POST-запрос-в форме sidebar'а. Это разные формы
2) при сознании формы для ввода новой записи нажимается кнопка из формы-заголовка и, поэтому таблица перерисовывается согласно условий фильтрации (они хранятся в этой форме).
3) при попытке открыть в форме sidebar'а реальную строку таблицы, я не могу передать в функцию, выбирающую содержимое этой таблицы, условия, с которыми она была на момент нажатия кнопки, отфильтрована. И у меня она отображается вообще без фильтрации. Картинку могу приложить, просто сейчас там все закомментировано, не работает
mokynis
вот картинки. Открываю вторую строку и получаю эту строку сбоку и совершенно не ту информацию в таблице
mokynis
картинки отправляются только по одной
FishHook
mokynis
данные о фильтрации хранятся в форме-заголовке, а кнопка, посылающая POST-запрос-в форме sidebar'а. Это разные формы
обе формы генерируются вашим бэкендом, то есть джангой, засуньте в action обеих форм одинаковую ссылку
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB