Как получить данные с страницы Django

Рейтинг: 0Ответов: 2Опубликовано: 25.08.2023

У меня есть таблица. Приведу только часть, где используется шаблонизатор

<tbody>
  {% for el in getted_data %}
    <tr>
      <form action="{% url 'orders_page' %}" method="post">
        {% csrf_token %}
        <th scope="row"><input type="text" name="client_name" value="{{ el.client_name }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></th>
        <td><input type="text" name="order_number" value="{{ el.order_number }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="text" name="phone_number" value="{{ el.phone_number }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="text" name="print_type" value="{{ el.print_type }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><a href="#" style="text-decoration:dotted; color: rgb(1, 10, 177);">файл.docx</a></td>
        <td><input type="text" name="numbers_of_page" value="{{ el.numbers_of_page }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="submit" name="document_printed" class="btn btn-success" value="Готово"></td> <!-- кнопка -->
      </form>
    </tr>
  {% endfor %}
</tbody>

views.py

class OrdersView(View):
    def get(self, r: WSGIRequest) -> HttpResponse:
        getted_data = OrderModel.objects.filter(status='getted')
        printed_data = OrderModel.objects.filter(status='completed')

        context = {
            'getted_data': getted_data,
            'getted_data_len': len(getted_data),
            'printed_data': printed_data,
            'printed_data_len': len(printed_data)
        }

        return render(r, 'main_service/orders.html', context=context)

    def post(self, r: WSGIRequest) -> HttpResponse:
        if 'document_printed' in r.POST:
            print(r.POST)
            print(r.POST.get('document_printed', False))
        return redirect('/orders')

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

Ответы

▲ 0Принят

Начнем с того, что внутри твоего представления (view) на сервере ты можешь получить данные из POST-запроса, если они были отправлены формой. Для этого тебе нужно использовать request.POST.get() или request.POST[''], где вместо пустых кавычек передай имя поля, с которого ты хочешь получить данные.

В твоем случае, если ты хочешь получить данные из строк таблицы, когда нажата кнопка "Готово", ты можешь добавить скрытое поле (hidden field) в твою форму для передачи данных из этих строк. Я бы сделал так:

<form action="{% url 'orders_page' %}" method="post">
  {% csrf_token %}
  <input type="hidden" name="client_name" value="{{ el.client_name }}">
  <input type="hidden" name="order_number" value="{{ el.order_number }}">
  <!-- Остальные скрытые поля с данными -->
  <td><input type="submit" name="document_printed" class="btn btn-success" value="Готово"></td>
</form>

Затем в твоем представлении ты можешь получить данные из этих полей, проверив наличие document_printed в request.POST, и извлечь значения с помощью request.POST.get():

def post(self, request):
    if 'document_printed' in request.POST:
        client_name = request.POST.get('client_name', '')
        order_number = request.POST.get('order_number', '')
        # Извлеките остальные значения из скрытых полей

        # Обработка данных...

    return redirect('/orders')

Таким образом, ты сможешь получить данные из строк таблицы при нажатии на кнопку.

▲ 0

Еще можно просто вместо disabled="disabled" в аргументах каждого поля поставить readonly="readonly" и даже с тем, что было в вопросе все сразу работает, поле активное, а значит отдает значение, я так думаю

<form action="{% url 'orders_page' %}" method="post">
  {% csrf_token %}
  <input type="text" readonly="readonly" name="client_name" value="{{ el.client_name }}">
  <input type="text" readonly="readonly" name="order_number" value="{{ el.order_number }}">
  <!-- Остальные скрытые поля с данными -->
  <td><input type="submit" name="document_printed" class="btn btn-success" value="Готово"></td>
</form>

Только остается стили поменять)