Задать вопрос
@DenisProk

Как в шаблоне выделить несколько экземпляров модели чекбоксами и по нажатию на кнопку получить список выделенных экземпляров?

Работаю над созданием удобного сайта для работы с закупками. Имеется страница с таблицей, на которую выводятся закупки и очень не хватает опции, когда ты чекбоксами отмечаешь нужные закупки, а затем нажимаешь на отдельную кнопку, чтобы произвести с ними какие-то действия, например изменить у всех выделенных статус.

689c4842b760d593701305.png

Так как подобного я никогда не делал, да и вообще я только учусь, прошу хотя бы на словах разжевать что для этого нужно сделать.

Как я себе это представляю:
- добавить поле BooleanField (отвечающее за чекбокс) в модель закупки;
- шаблон с таблицей, куда выводятся экземпляры как-то нужно переделывать в форму (это самое непонятное);
- кнопка с функцией будет менять значение поля, после чего запросом к БД можно выяснить у каких экземпляров это поле изменено и получить список нужных закупок.

Но это все как-то очень сложно, наверняка есть более простой и понятный способ получить список выделенных экземпляров, может вообще отказаться от чекбоксов и как-то по-другому выделять нужные закупки?
  • Вопрос задан
  • 58 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Предлагаю использовать стандартный вариант с html (предварительно, нужно найти этот шаблон). Галочка + выпадающий список (select) + кнопка отправки + уведомление в шаблоне будет выглядеть примерно так:
<!-- Уведомления -->
{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li class="{{message.tags}}">{{message}}</li>
        {% endfor %}
    </ul>
{% endif %}

<form method="post" action="{% url 'view_name' %}">
    {% csrf_token %}
    <table>
        {% for item in items %}
            <tr>
                <!-- Здесь другие столбцы -->
                <td><input type="checkbox" name="selected_items" value="{{item.id}}"></td>
            </tr>
        {% endfor %}
    </table>

    <select name="action">
        <option value="action_1">Действие 1</option>
        <option value="action_2">Действие 2</option>
    </select>
    <button type="submit">Применить</button>
</form>

Затем, в представление обрабатываем данные из шаблона выше, пусть это будет view_name. Например, некоторые основные моменты:
# Получаем из POST запроса выбранные items
selected_ids = request.POST.getlist('selected_items')

# Проверить, есть ли что в selected_ids, если нет, сообщить юзверю, пусть жмет сильнее
if not selected_ids:
    messages.warning(request, "Товарищ Юзверь, жми сильнее")
    return redirect('view_name')

# Получаем action
action = request.POST.get('action')

# Смотрим, что пришло в action, затем выполнить нужное действие, пусть это будет следующее:

# Получаем из бд все объекты по списку selected_ids одним запросом
items_to_update = ItemModel.objects.filter(id__in=selected_ids)

# Обновляем поле, пусть это будет is_selected
updated_count = items_to_update.update(is_selected=True)

# Обрабатываем успешный успех
messages.success(request, f"Молодец Юзверь, успешно отработано: {updated_count} элементов, возьми с полки пирожок")
return redirect('view_name')

Ну и условная модель:
from django.db import models

class ItemModel(models.Model):
    title = models.CharField(max_length=200)
    is_selected = models.BooleanField(default=False)

    def __str__(self):
        return self.title
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы