Форма редактирования 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() выполняет следующие действия:

  1. Получить объект Post по идентификатору или перенаправить на страницу 404, если идентификатор не существует.
  2. Создать объект PostForm и установить аргумент экземпляра для объекта post.
  3. Создать шаблон 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/, вы увидите список постов со ссылкой редактирования для каждого, как показано на следующем рисунке:

Форма редактирования django - добавить ссылку редактирования

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

Пример редактирования поста «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», и вы увидите, что пост будет обновлен:

Пример успешного обновления поста

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *