Форма редактирования Django в Python
Мы создадим форму редактирования 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="{% 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», и вы увидите, что пост будет обновлен: