Python: Model.objects.all() — как перебирать его с помощью флажков POST

Я строил экспорт CSV, используя Python/Django. При отправке всех элементов, перечисленных в списке изменений, все работает как часы.

Теперь я пытаюсь использовать раскрывающийся список действий и экспортировать только те элементы, выбранные с помощью флажков, но я не могу заставить его работать.

Мой текущий код, тот, который работает даже с раскрывающимся списком действий, но экспортирует ВСЕ элементы, независимо от того, что было проверено:

def export_this_list(self, request, queryset):
    """Generates participants list in Excel sheet."""

    csv_elements = Enrolment.objects.all().order_by('-training__date')
    for elem in csv_elements:

Когда csv_elements заменяется request.POST.getlist, очевидно, ничего не работает.

def export_this_list(self, request, queryset):
    """Generates participants list in Excel sheet."""

    csv_elements = request.POST.getlist('_selected_action')

or

    csv_elements = []
    for o in request.POST.getlist('_selected_action'):

Вопрос: каков синтаксис для объединения моей модели с действием POST?


person Greg Bialowas    schedule 11.09.2017    source источник
comment
Можете ли вы показать свой шаблон? Что именно находится в _selected_action?   -  person Daniel Roseman    schedule 11.09.2017
comment
_selected_action является частью шаблона по умолчанию, поставляемого с Django. Мне нужно использовать то, что у меня уже есть: ‹td class=action-checkbox›‹input class=action-select name=_selected_action value=44 type=checkbox›‹/td›   -  person Greg Bialowas    schedule 11.09.2017
comment
Хорошо, вы не сказали, что это было в админке. Итак, это явно отправка списка идентификаторов. Где остальная часть цикла for? Вы запрашиваете модель где-нибудь?   -  person Daniel Roseman    schedule 11.09.2017
comment
Ой, извините, это все для панели администратора. Это моя текущая строка для получения всех элементов в модели: csv_elements = Enrolment.objects.all().order_by('-training__date') Остальная часть цикла на самом деле не существует, потому что я не уверен, что правильно синтаксис должен быть, и после нескольких попыток, случайных попыток, все, что я получаю, это куча ошибок, например. AttributeError: объект 'str' не имеет атрибута 'Регистрация'   -  person Greg Bialowas    schedule 11.09.2017
comment
Что я имел в виду: когда я заменяю строку csv_elements на это: ---csv_elements = [] for o в request.POST.getlist('_selected_action'):---, остальная часть цикла на самом деле не существует, я застрял на выборе количества элементов против всех из них.   -  person Greg Bialowas    schedule 11.09.2017
comment
Но, как я уже сказал, это возвращает список идентификаторов. Очевидно, вам нужно выполнить запрос, чтобы получить объекты Enrollment для этих идентификаторов.   -  person Daniel Roseman    schedule 11.09.2017
comment
Я не знаю, как ответить на ваш вопрос, так как мои знания о P/D практически отсутствуют. Модель, которую я использовал, выглядит примерно так: AUTH_USER_MODEL, related_name='регистрации', verbose_name=_('декларант')) invoice_data = JSONField   -  person Greg Bialowas    schedule 11.09.2017


Ответы (1)


Когда вы выполняете csv_elements = Enrolment.objects.all(), вы извлекаете набор объектов Enrollment из базы данных, которые впоследствии перебираете.

Но когда вы делаете csv_elements = request.POST.getlist('_selected_action'), у вас есть список идентификаторов. У вас нет объектов Enrollment; они все еще находятся в базе данных, и вы ничего не сделали для их получения. Идентификаторы — это ключи объектов в базе данных, но что касается вашего кода, то пока это просто числа.

Вам действительно нужно обратиться к базе данных, чтобы получить эти объекты. Вот один из способов сделать это:

selected_ids = request.POST.getlist('_selected_action')
csv_elements = Enrolment.objects.filter(id__in=selected_ids)
person Daniel Roseman    schedule 11.09.2017
comment
Как я уже сказал, мои знания Python/Django практически отсутствуют. Глядя на ваш код, все кажется таким очевидным, но я потратил много времени, даже не приблизившись к вашему решению. Код, который вы мне дали, работает как шарм, экспортированный список именно такой, каким он должен быть. Большое спасибо! - person Greg Bialowas; 11.09.2017