Мы создадим форму редактирования Django в Python, которая обновит запись в блоге и сохранит изменения в базе данных.
Создание шаблона URL
Сначала создайте шаблон URL для редактирования поста:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="posts"),
path('post/create', views.create_post, name="post-create"),
path('post/edit/<int:id>/', views.edit_post, name="post-edit"),
path('about/', views.about, name="about"),
]
URL-адрес редактирования поста принимает идентификатор как целое число, указанное шаблоном. Например, если вы редактируете пост с идентификатором 1, URL-адрес будет:
http://127.0.0.1/post/update/1/
Django передаст идентификатор(1) второму аргументу функции edit_post().
Если вы передадите в URL-адрес значение, не являющееся целым числом, например:
http://127.0.0.1/post/update/abcd/
Django выполнит перенаправление на 404, поскольку он не соответствует ни одному URL-адресу в шаблонах URL-адресов.
Как определить функцию представления
Определите функцию edit_post() в файле views.py:
from django.shortcuts import render,redirect, get_object_or_404
from django.contrib import messages
from .models import Post
from .forms import PostForm
def edit_post(request, id):
post = get_object_or_404(Post, id=id)
if request.method == 'GET':
context = {'form': PostForm(instance=post), 'id': id}
return render(request,'blog/post_form.html',context)
# other functions
Как это работает:
- Сначала импортируйте функцию get_object_or_404 из модуля django.shortcuts:
from django.shortcuts import render,redirect, get_object_or_404
Функция get_object_or_404() получает объект по идентификатору или перенаправляет на страницу 404, если идентификатор не существует.
- Во-вторых, определите функцию edit_post(), которая принимает объект HttpRequest(запрос) и идентификатор как целое число.
Функция edit_post() выполняет следующие действия:
- Получить объект Post по идентификатору или перенаправить на страницу 404, если идентификатор не существует.
- Создать объект PostForm и установить аргумент экземпляра для объекта post.
- Создать шаблон post_form.html.
- В-третьих, измените шаблон post_form.html, чтобы изменить заголовок формы. В настоящее время он показывает Create Post.
{% extends 'base.html' %}
{% block content %}
<h2>{% if id %} Edit {% else %} New {% endif %} Post</h2>
<form method="post" novalidate>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
{% endblock content %}
Если id (id поста) доступен, то форма находится в режиме редактирования. В противном случае она находится в режиме создания. Исходя из этой логики, мы соответствующим образом меняем заголовок формы.
- В-четвертых, измените шаблон home.html, включив ссылку редактирования в каждый пост:
{% extends 'base.html' %}
{% block content %}
<h1>My Posts</h1>
{% for post in posts %}
<h2>{{ post.title }}</h2>
<small>Published on {{ post.published_at | date:"M d, Y" }} by {{ post.author | title}}</small>
<p>{{ post.content }}</p>
<p><a href="https://copython.ru/{% url"post-edit' post.id %}">Edit</a></p>
{% endfor %}
{% endblock content %}
- В-пятых, откройте URL-адрес списка постов http://127.0.0.1/, вы увидите список постов со ссылкой редактирования для каждого, как показано на следующем рисунке:

Если вы нажмете ссылку «Edit», чтобы отредактировать пост, вы увидите форму, заполненную значениями полей. Например, вы можете отредактировать пост «Flat is better than nested», вы увидите следующую форму:

Чтобы отредактировать пост, вы меняете значения и нажимаете кнопку Save. Однако мы еще не добавили код, который обрабатывает HTTP POST-запрос.
- В-шестых, добавьте код, который обрабатывает HTTP-запрос POST, т.е. при нажатии кнопки Save:
def edit_post(request, id):
post = get_object_or_404(Post, id=id)
if request.method == 'GET':
context = {'form': PostForm(instance=post), 'id': id}
return render(request,'blog/post_form.html',context)
elif request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
messages.success(request, 'The post has been updated successfully.')
return redirect('posts')
else:
messages.error(request, 'Please correct the following errors:')
return render(request,'blog/post_form.html',{'form':form})
Обновите публикацию, добавив к заголовку три звездочки(***):

Нажмите кнопку «Save», и вы увидите, что пост будет обновлен:

