Найти в Дзене
And.Action

Начал изчать Django FrameWork ч.11 Формы.

Доброго времени суток, чтобы каждый раз не залезать в административную панель, давайте сделаем форму для создания и редактирования наших постов. Создадим файл blog/forms.py from django.forms import ModelForm
from .models import Post
class PostForm(ModelForm):
class Meta:
model = Post
fields = ('title', 'text') Импортируем модель формы и нашу модель Post, чтобы связать форму с постом. Там же мы указываем, какие поля будут у нашей формы. Соответственно поле заголовка-title и поле текста-text. Поля соответствуют полям в нашей модели Post. Добавим в наш базовый шаблон ссылку на страницу создания нового поста. Открываем blog/templates/blog/base.html и вставляем <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav offset-md-2">
<li class="nav-item active">
<a class="nav-link" href="{% url 'post_list' %}">
Main Page
</a>
</li>
<li class="nav-item active">
<a class="n

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

Создадим файл blog/forms.py

from django.forms import ModelForm
from .models import Post


class PostForm(ModelForm):

class Meta:
model = Post
fields = ('title', 'text')

Импортируем модель формы и нашу модель Post, чтобы связать форму с постом. Там же мы указываем, какие поля будут у нашей формы. Соответственно поле заголовка-title и поле текста-text. Поля соответствуют полям в нашей модели Post.

Добавим в наш базовый шаблон ссылку на страницу создания нового поста.

Открываем blog/templates/blog/base.html и вставляем

<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav offset-md-2">
<li class="nav-item active">
<a class="nav-link" href="{% url 'post_list' %}">
Main Page
</a>
</li>

<li class="nav-item active">
<a class="nav-link" href="{% url 'post_new' %}">
New Post
</a>
</li>

</ul>
</div>

Работать пока не будет так как у нас не определён url post_new, для которого соответственно не написано представление. Давайте сделаем это:
Открываем blog/urls.py и добавляем запись в наш список urlpatterns:
path('post/new/', views.post_new, name='post_new'),

Затем в файле blog/views.py пишем представление:

-2

Ну и соответственно создадим для него html шаблон:

-3

{% csrf_token %} - делает нашу форму защищённой.

Запускаем сервер, обновляемся, заходим на станицу и вуаля, форма есть. Но что произойдёт, если мы нажмём на кнопку Save. Ровно ничего, так как форма никуда не отправляет наши данные.
Давайте напишем обработчик для нашей формы:

Перейдём в файл blog/views.py

-4

Разберём:
Проверяем два условия, когда мы только зашли на страницу и когда передаём данные:
if request.method == "POST":
....
else:
form = PostForm()

Если method — POST, тогда мы хотим построить PostForm с данными из формы. Делаем еще одну проверку, если все поля формы заполнены верно if form.is_valid(): тогда сохраняем форму(но пока не в модель commit=False) и ставим автора по умолчанию авторизованного пользователя: post.author = request.user, затем дату публикации настоящее время post.published = timezone.now() и сохраняем данные в модель post.save(). Дальше необходимо перенаправление, поэтому импортируем функию redirect

from django.shortcuts import render, get_object_or_404, redirect

дописываем return redirect('post_detail', pk=post.pk)

post_detail — это имя представления, которое нам необходимо.
Это представление требует переменную pk? Чтобы передать её представлению, мы используем аргумент pk=post.pk, где post — это новая запись в блоге.

Отлично, форма для создания поста, теперь нам надо сделать, чтобы мы могли редактировать свой пост:

Предлагаю сделать кнопку для редактирования поста, непосредственно в шаблоне post_detail.

Открываем blog/templates/blog/post_detail.html

Добавляем кнопку Edit:

<div class="card-body">
<h5 class="card-title">{{ post.title }}</h5>
<p class="card-text">{{ post.text }}</p>
<a href="{% url 'post_edit' pk=post.pk %}" class="btn btn-info">Edit</a>
<a href="{% url 'post_list' %}" class="btn btn-primary">Back</a>
</div>

Пишем для неё url в blog/urls.py добавляем:

path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),

И делаем представление post_edit, шаблон у нас уже есть post_new.html

-5

Немного похоже на добавление прошлого поста, разница лишь в том, что здесь мы сначала берём из базы объект поста, с ключом, того поста, который мы хотим отредактировать.
Как это работает. Например мы открываем 4 пост, по ссылке
http://127.0.0.1:8000/post/4/

Primary Key = 4

Нажимаем кнопку отредактировать и представление начинает отрабатывать функцию post_edit.

Берем из базы объект get_object_or_404(Post, pk=pk) модели пост с pk=4

Дальше форма заполняется данными поста, которые там были instance=post, то есть мы уже в форме увидим тот пост, который там был. Редактируем как угодно и нажимаем Save. Механизм редактирования поста, практически такой же, как механизм создания поста.

Вот собственно и всё. Весь проект, если у вас какие-то вопросы по исходникам находится в репозитории:

https://github.com/SuperSerg58/Django_girls_lessons

Отдельное спасибо проекту DjangoGirls, который даёт неплохой старт в понимании основ Django.

Всего хорошего, учим Django вместе.