Как в Django отредактировать данные из БД через форму Django, чтобы не пришлось открыть новую страницу для этого?

В Django можно отредактировать данные из базы данных через форму, не открывая новую страницу, с использованием AJAX-запросов.

Для начала, мы должны создать шаблон (HTML-файл), содержащий форму, в которой будем представлять данные для редактирования. В этой форме, например, мы можем использовать поля типа input или select. Форма может выглядеть примерно так:

<form id="edit-form" method="POST">
  {% csrf_token %}
  <input type="text" id="name" name="name" value="{{ object.name }}">
  <input type="text" id="email" name="email" value="{{ object.email }}">
  <button type="button" id="save-button">Сохранить</button>
</form>

Здесь мы использовали Django-переменные object.name и object.email, чтобы отобразить текущее значение полей. Для этого в шаблоне должен быть передан объект, который мы хотим отредактировать.

После того, как мы создали форму, нам нужно добавить функционал, который будет отправлять данные на сервер, не перезагружая страницу. Для этого мы будем использовать JavaScript и AJAX.

В JavaScript мы можем использовать библиотеку jQuery, чтобы сделать AJAX-запрос. Ниже приведен пример кода:

$(document).ready(function() {
  $("#save-button").click(function() {
    var name = $("#name").val();
    var email = $("#email").val();
    var csrf = $("input[name='csrfmiddlewaretoken']").val();

    $.ajax({
      type: "POST",
      url: "/edit/",
      data: {
        'name': name,
        'email': email,
        'csrfmiddlewaretoken': csrf
      },
      success: function(response) {
        alert("Данные успешно сохранены!");
      },
      error: function(xhr, ajaxOptions, thrownError) {
        alert("Ошибка при сохранении данных. Пожалуйста, повторите попытку позже.");
      }
    });
  });
});

В этом примере мы делаем AJAX-POST-запрос на URL-адрес /edit/, передавая данные из формы в параметрах запроса. Параметр csrfmiddlewaretoken обязателен для всех AJAX-запросов в Django, чтобы защитить от атаки CSRF. После успешного выполнения запроса, мы показываем оповещение об успешном сохранении данных. В случае ошибки, мы также показываем сообщение об ошибке.

Далее, в нашем Django-приложении мы должны создать соответствующий URL-шаблон и представление для обработки этого AJAX-запроса. В URL-шаблоне мы добавляем следующую строку:

urlpatterns = [
    # ...
    path('edit/', views.edit_data, name='edit-data'),
    # ...
]

В представлении мы можем получить данные из запроса и выполнить соответствующие операции с моделью данных. Также, мы должны вернуть ответ в формате JSON. Пример представления может выглядеть так:

from django.http import JsonResponse

def edit_data(request):
    if request.method == 'POST' and request.is_ajax():
        name = request.POST.get('name')
        email = request.POST.get('email')

        # выполнение операций с моделью данных (например, сохранение)

        return JsonResponse({'status': 'success'})
    else:
        return JsonResponse({'status': 'error'})

В этом примере мы проверяем, что запрос был выполнен методом POST и посредством AJAX. Затем, мы получаем значения полей из запроса и выполняем соответствующие операции. В конце, мы возвращаем ответ в формате JSON.

И наконец, мы должны добавить JavaScript-файл и URL-шаблон в соответствующие HTML-шаблоны. Мы можем сделать это, добавив следующие строки:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="{% static 'js/edit.js' %}"></script>

Где edit.js - это файл с кодом JavaScript, который мы создали ранее.

После этих шагов, когда пользователь нажимает кнопку "Сохранить" в форме, данные будут отправлены на сервер, обработаны с помощью представления Django, и пользователь увидит оповещение об успешном сохранении данных.

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