Книга «Изучаем Python»



Pdf көрінісі
бет225/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   221   222   223   224   225   226   227   228   ...   238
forms.py

from django import forms

from .models import Topic

class TopicForm(forms.ModelForm):



    class Meta:

        model = Topic



        fields = ['text']

        labels = {'text': ''}



Сначала импортируется модуль 

forms


 и модель, с которой мы будем работать: 

Topic


. В точке  определяется класс с именем 

TopicForm

, наследующий от 

forms.


ModelForm

. Простейшая версия 

ModelForm

 состоит из вложенного класса 

Meta



который сообщает Django, на какой модели должна базироваться форма и какие 



поля на ней должны находиться. В точке  форма создается на базе модели 

Topic


а на ней размещается только поле 

text

 . Код  приказывает Django не генериро-



вать  подпись для текстового поля.

URL-адрес для new_topic

URL-адрес новой страницы должен быть простым и содержательным, поэтому 

после того, как пользователь выбрал команду создания новой темы, он направля-

ется по адресу http://localhost:8000/new_topic/. Ниже приведена схема URL для 

страницы 

new_topic

, которая добавляется в 

learning_logs/urls .py

:

urls.py

...

urlpatterns = [



...

    # Страница для добавления новой темы

    url(r'^new_topic/$', views.new_topic, name='new_topic'),

]

Эта схема URL будет отправлять запросы функции представления 



new_topic()

которую мы сейчас напишем.




410    Глава 19  •  Учетные записи пользователей

Функция представления new_topic()

Функция 

new_topic()

 должна обрабатывать две разные ситуации: исходные за-

просы страницы 

new_topic

 (в этом случае должна отображаться пустая форма) 

и обработка данных, отправленных через форму. Затем она должна перенаправить 

пользователя обратно на страницу 

topics

:

views.py



from django.shortcuts import render

from django.http import HttpResponseRedirect

from django.core.urlresolvers import reverse

from .models import Topic

from .forms import TopicForm

...


def new_topic(request):

    """Определяет новую тему."""

    if request.method != 'POST':



        # Данные не отправлялись; создается пустая форма.

        form = TopicForm()



    else:

        # Отправлены данные POST; обработать данные.

        form = TopicForm(request.POST)



        if form.is_valid():

            form.save()



            return HttpResponseRedirect(reverse('learning_logs:topics'))

    context = {'form': form}



    return render(request, 'learning_logs/new_topic.html', context)

Мы импортируем класс 

HttpResponseRedirect

, который будет использоваться 

для перенаправления пользователя к странице 

topics


 после отправки введенной 

темы. Функция 

reverse()

 определяет URL по заданной схеме URL (то есть Django 

сгенерирует URL при запросе страницы). Также импортируется только что напи-

санная форма 

TopicForm

.

Запросы GET и POST



При построении веб-приложений используются два основных типа запросов — 

GET и POST. Запросы GET используются для страниц, которые только читают 

данные с сервера, а запросы POST обычно используются в тех случаях, когда 

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

наших форм будет использоваться метод POST (существуют и другие разновид-

ности запросов, но в нашем проекте они не используются).

Функция 

new_topic()

 получает в параметре объект запроса. Когда пользователь 

впервые запрашивает эту страницу, его браузер отправляет запрос GET. Когда 

пользователь уже заполнил и отправил форму, его браузер отправляет запрос 

POST. В зависимости от типа запроса мы определяем, запросил ли пользователь 




Редактирование данных    411

пустую форму (запрос GET) или предлагает обработать заполненную форму (за-

прос POST).

Метод запроса — GET или POST — проверяется в точке . Если метод запро-

са отличен от POST, вероятно, используется запрос GET, поэтому необходимо 

вернуть пустую форму (даже если это запрос другого типа, это все равно безопас-

но). Мы создаем экземпляр 

TopicForm

 , сохраняем его в переменной 

form


 и от-

правляем форму шаблону в словаре 

context

 



. Так как при создании 

TopicForm

 

аргументы не передавались, Django создает пустую форму, которая заполняется 



пользователем.

Если  используется  метод  запроса  POST,  выполняется  блок 

else

,  кото-


рый  обрабатывает данные, отправленные в  форме. Мы создаем экземпляр 

TopicForm

  и передаем ему данные, введенные пользователем, хранящиеся 

в 

request.POST



. Возвращаемый объект 

form


 содержит информацию, отправлен-

ную пользователем.

Отправленную информацию нельзя сохранять в базе данных до тех пор, пока она 

не будет проверена . Функция 

is_valid()

 проверяет, что все обязательные поля 

были заполнены (все поля формы по умолчанию являются обязательными), а вве-

денные данные соответствуют типам полей — например, что длина текста меньше 

200 символов, как было указано в файле 

models .py

 в главе 18. Автоматическая про-

верка избавляет нас от большого объема работы. Если все данные действительны, 

можно вызвать метод 

save()


 , который записывает данные из формы в базу дан-

ных. После того как данные будут сохранены, страницу можно покинуть. Мы ис-

пользуем вызов 

reverse()

 для получения URL-адреса страницы 

topics


 и передаем 

его функции 

HttpResponseRedirect()

 , перенаправляющей браузер пользователя 

на страницу 

topics


. На этой странице пользователь видит только что введенную 

им тему в общем списке тем.

Шаблон new_topic

Теперь создадим новый шаблон с именем 

new_topic .html

 для отображения только 

что созданной формы:



Достарыңызбен бөлісу:
1   ...   221   222   223   224   225   226   227   228   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет