@pydjango
Django

Полезная информация и правила: https://github.com/amureki/django_faq Вакансии и резюме: @django_jobs Пофлудить идём сюда: @django_flood Статистика чата: combot.org/chat/-1001063854692

1741 members

Архив канала @pydjango 30 сентября 2016 г.

08:31:13 ДП
User 101776988
подскажите, плз, как правильно делать кнопку "отмены" в форме подтверждения (допустим, удаления объекта) для пользователя? и делать ли ее вообще?
08:31:43 ДП
User 167767298
Ссылку на страницу назад
08:31:54 ДП
User 101776988
т.е. форма типа  <form action="{% url 'comparator:delete_case' comparecase.id %}" method="post"> блаблабла уверены ли вы
08:32:07 ДП
User 167767298
Посмотри как в админке сделано при удалении
08:32:21 ДП
User 101776988
внизу  <input type="submit" value="Confirm">
08:32:42 ДП
User 101776988
а кнопка отмены input'ом?
08:32:48 ДП
User 101776988
User 167767298
Посмотри как в админке сделано при удалении
а, ок, гляну, пасиб
08:33:14 ДП
User 167767298
Вроде просто a, хотя могу ошибаться.
08:33:33 ДП
User 101776988
а если просто а, то она же будет не как кнопка, а как ссылка
08:33:38 ДП
User 101776988
некрасиво
08:33:40 ДП
User 167767298
Возможно онклик в button
08:34:02 ДП
User 101776988
во, я так и хотел сначала сделать, но засомневался
08:34:04 ДП
User 167767298
Да вроде там онклик был
08:34:27 ДП
User 101776988
а вообще ее принято делать? в принципе юзер сам может назад нажать в браузере
08:34:40 ДП
User 101776988
если передумал удалять например
08:34:47 ДП
User 167767298
И жс на страницу назад.
08:35:05 ДП
User 167767298
Лучше явно, а то за сомневается и вообще закроет страницу.
08:35:33 ДП
User 167767298
А потом будет мучиться и проходить всю иерархию заново.
08:38:04 ДП
User 101776988
да, согласен, сделаю через онклик, спасибо
08:45:51 ДП
User 378433
можно воткнуть дополнительный параметр типа _confirm=true
08:45:53 ДП
User 378433
в форму
08:46:27 ДП
User 378433
при запросе на /delete/ проверять наличие, без него возвращать форму конфирма, а с ним удалять
08:46:44 ДП
User 100243492
блин, как всетаки весело клепать шаблончики
08:47:23 ДП
User 100243492
какого-же это всетаки погрязнуть в API'шках
08:47:35 ДП
User 100243492
одни JSON, да XML
08:47:39 ДП
User 100243492
шедуллеры
08:48:22 ДП
User 378433
здорово же
08:48:29 ДП
User 378433
верстка - это вторично
08:49:34 ДП
User 378433
я забыл как называется чувство очень сильного удовлетворения
08:49:43 ДП
User 100243492
эйфория
08:50:11 ДП
08:50:38 ДП
User 378433
эйфория - это когда потреление рамы проектом снес с 16 гигабайт до 100 МБ
08:50:48 ДП
User 378433
вот это здорово
08:50:49 ДП
08:52:33 ДП
User 378433
и ничего не поломалось
08:54:55 ДП
User 100243492
О_о ты там чего крутил?
08:58:44 ДП
User 378433
резал одну большую транзакцию
12:41:15 ПП
User 101776988
подкажите, плз. имею конструкцию вида   last_unit = CompareUnit.objects.filter(case_id__exact=case.id).reverse()[:1]  в надежде получить из нее некий "последний юнит", принадлежащий определенному "кейсу". затем мне нужно взять у этого последнего юнита свойство "position", т.е. last_unit.position. но может так оказаться, что в кейсе нет ни одного юнита и вывалится AttributeError. как правильно делать проверку в таком случае?
12:42:09 ПП
User 101776988
я сначала хотел сделать if last_unit: но ведь фильтр вернет QuerySet в любом случае, как я понимаю
12:44:16 ПП
User 107485588
можешь сделать проверку на каунт например filter(...).count() > 0
12:45:41 ПП
User 101776988
да, можно. а так обычно делают или есть более элегантный способ? а то какое-то выражение уж больно многослойное получается
12:47:29 ПП
User 101776988
ну т.е. я выходит должен сделать проверку  if last_unit.count== 1  но как-то коряво это смотрится
12:47:59 ПП
User 101776988
типа убедиться, что фильтр вернул мне в QuerySet значение, и оно всего одно...
12:49:03 ПП
User 50636399
а в чем задача вообще? убедиться что есть хоть одно значение в таблице? много ли там записей сейчас и в будущем ?
12:52:36 ПП
User 101776988
ну у каждого кейса есть юниты. у каждого юнита есть позиция. добавляя новый юнит в кейс я хочу чтоб он встал в конец, т.е. получил последнюю позицию. для этого мне надо проверить, есть ли у этого кейса уже юниты и если есть, взять позицию последнего из них. а если это создается самый первый юнит, то дать ему позицию 0
12:53:30 ПП
User 101776988
в базе сейчас пусто, в теории должно быть много много кейсов, но мало-мало юнитов у каждого, в среднем 3-5
01:12:16 ПП
User 107485588
можно еще так попробовать получить последний юнит
01:12:58 ПП
User 158455295
Если я правильно понял задачу, то можно сообразить что-то типа этого:

position = 0
if case.units.all()
  position = case.units.last().position
Unit.objects.create(position=position, case=case)
01:13:32 ПП
User 107485588
Unit.objects.get(case=case, pk=Unit.objects.aggregate(Max("pk"))["pk__max"])
01:13:51 ПП
User 107485588
и обрабатывать уже Unit.DoesNotExist ексепшн
01:14:12 ПП
User 107485588
а если все ок - вернет последний созданный юнит
01:15:09 ПП
User 158455295
Если цель вернуть именно последний созданный юнит то отлично подойдет Unit.objects.last()
02:33:53 ПП
User 101776988
User 158455295
Если цель вернуть именно последний созданный юнит то отлично подойдет Unit.objects.last()
сорри, отвлекли. так вот да, .last() - то, что нужно. и еще моя ошибка была в том, что я искал поле у QuerySet, а надо было из него взять еще [0]
02:35:38 ПП
User 100243492
User 107485588
Unit.objects.get(case=case, pk=Unit.objects.aggregate(Max("pk"))["pk__max"])
та зачем так!
Unit.objects.annotate(pk_max=Max("pk")).get(case=case, pk=pk_max)
02:36:04 ПП
User 100243492
и он запилит нормальный запрос с аггрегациоными функциями без повторного селекта
02:36:27 ПП
User 100243492
так же и по лукапам можно пробежаться
02:36:32 ПП
User 101776988
User 100243492
та зачем так!
Unit.objects.annotate(pk_max=Max("pk")).get(case=case, pk=pk_max)
кстати наверное с max - еще изящнее, выглядит очень читаемо
02:37:37 ПП
User 101776988
а то у меня тут еще сомнения возникли, по какому полю он будет их сортировать в фильтре. я вроде читал, что это где-то задается, но забыл как
02:40:06 ПП
User 100243492
как задашь, так и будет сортировать
02:40:20 ПП
User 101776988
а вот я забыл где задается поле для сортировки
02:40:21 ПП
User 100243492
там можно много изящных запросиков замутить
02:40:48 ПП
User 100243492
order_by() и передаешь арги по каким полям сортировать
02:41:19 ПП
User 101776988
а разве нет возможности задать поле для сортировки по умолчанию?
02:41:52 ПП
User 158455295
В модели можно
02:42:08 ПП
User 101776988
вот и мне так казалось. а напомните параметр плз
02:43:43 ПП
User 158455295
https://docs.djangoproject.com/en/1.10/ref/models/options/#ordering
02:45:20 ПП
User 101776988
а, да, спасибо
02:49:27 ПП
User 101776988
User 100243492
та зачем так!
Unit.objects.annotate(pk_max=Max("pk")).get(case=case, pk=pk_max)
а зачем вообще нужен annotate? почему не просто .objects.get(case=case, pk=Max('pk'))? так нельзя?
02:56:24 ПП
User 101776988
что-то я делаю не так. с annotate() выдает name 'pk_max' is not defined
02:57:27 ПП
User 37856825
F('pk_max') но мне кажется всё равно не будет работать
03:29:52 ПП
User 101776988
в итоге вот так сделал: 
    last_unit = CompareUnit.objects.filter(case=case).aggregate(Max('position'))['position__max']
    new_unit_position = 0 if last_unit is None else last_unit+1
 надеюсь не очень по-индийски получилось
04:13:21 ПП
User 378433
User 107485588
можешь сделать проверку на каунт например filter(...).count() > 0
.exists()
04:19:15 ПП
User 378433
User 101776988
подкажите, плз. имею конструкцию вида   last_unit = CompareUnit.objects.filter(case_id__exact=case.id).reverse()[:1]  в надежде получить из нее некий "последний юнит", принадлежащий определенному "кейсу". затем мне нужно взять у этого последнего юнита свойство "position", т.е. last_unit.position. но может так оказаться, что в кейсе нет ни одного юнита и вывалится AttributeError. как правильно делать проверку в таком случае?
.last()
04:29:33 ПП
User 101776988
User 378433
.last()
уже было, но нет. я фундаментально спутал понятия "последний элемент" и "элемент с наибольшим значением в поле... "
04:29:53 ПП
User 101776988
выше написал, как решил, работает
04:50:33 ПП
04:50:34 ПП
04:51:17 ПП
User 378433
Но все равно не пренебрегайте экзистом и ластом
04:51:25 ПП
User 378433
Они генерируют разные запросы
04:51:47 ПП
User 378433
Разные, чем каунт
04:51:54 ПП
User 378433
И слайс
04:51:57 ПП
User 378433
Вроде как
04:52:23 ПП
User 378433
Да и более осмысленно выглядят