From 980fe00a74a9ad013b945755415ace2e5429c3c2 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Wed, 27 Oct 2021 02:31:24 +0300 Subject: [RU] Remove notranslate (#2874) --- files/ru/learn/server-side/django/forms/index.html | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'files/ru/learn/server-side/django/forms') diff --git a/files/ru/learn/server-side/django/forms/index.html b/files/ru/learn/server-side/django/forms/index.html index 6652e56297..9b2c9a5ed3 100644 --- a/files/ru/learn/server-side/django/forms/index.html +++ b/files/ru/learn/server-side/django/forms/index.html @@ -50,7 +50,7 @@ translation_of: Learn/Server-side/Django/Forms

Форма описывается на языке HTML как набор элементов, расположенных внутри парных тэгов <form>...</form>. Любая форма содержит как минимум одно поле-тэг input типа type="submit".

-
<form action="/team_name_url/" method="post">
+
<form action="/team_name_url/" method="post">
     <label for="team_name">Enter name: </label>
     <input id="team_name" type="text" name="name_field" value="Default name for team.">
     <input type="submit" value="OK">
@@ -129,7 +129,7 @@ translation_of: Learn/Server-side/Django/Forms
 
 

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

-
from django import forms
+
from django import forms
 
 class RenewBookForm(forms.Form):
     renewal_date = forms.DateField(help_text="Enter a date between now and 4 weeks (default 3).")
@@ -160,7 +160,7 @@ class RenewBookForm(forms.Form):
 
 

Django предоставляет несколько мест где вы можете осуществить валидацию ваших данных. Простейшим способом проверки значения одиночного поля является переопределение методаclean_<fieldname>() (здесь, <fieldname> это имя поля, которое вы хотите проверить). Например, мы хотим проверить, что введённое значение renewal_date находится между текущей датой и  4 неделями в будущем. Для этого мы создаём метод clean_renewal_date(), как показано ниже:

-
from django import forms
+
from django import forms
 
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
@@ -201,7 +201,7 @@ class RenewBookForm(forms.Form):
 
 

Перед созданием отображения давайте добавим соответствующую конфигурацию URL-адреса для страницы обновления книг. Скопируйте следующий фрагмент в нижнюю часть файла locallibrary/catalog/urls.py.

-
urlpatterns += [
+
urlpatterns += [
     url(r'^book/(?P<pk>[-\w]+)/renew/$', views.renew_book_librarian, name='renew-book-librarian'),
 ]
@@ -219,7 +219,7 @@ class RenewBookForm(forms.Form):

Процесс обновления книги приводит к изменению информации в базе данных, таким образом, в соответствии с нашими соглашениями, в таком случае мы должны применять запрос типа POST. Фрагмент кода, представленный ниже, показывает (наиболее общую) схему работы для таких запросов. 

-
from django.shortcuts import get_object_or_404
+
from django.shortcuts import get_object_or_404
 from django.http import HttpResponseRedirect
 from django.urls import reverse
 import datetime
@@ -263,7 +263,7 @@ def renew_book_librarian(request, pk):
 
 

В отображении аргумент pk мы используем в функцииget_object_or_404() для получения текущего объекта типа BookInstance (если его не существует, то функция, а следом и наше отображение прервут своё выполнение, а на странице пользователя отобразится сообщение об ошибке: "объект не найден"). Если запрос вызова отображения не является POST-запросом, то мы переходим к условному блоку else, в котором мы создаём форму по умолчанию и передаём ей начальное значенияinitial для поля renewal_date (выделено жирным ниже, - 3 недели, начиная с текущей даты). 

-
    book_inst = get_object_or_404(BookInstance, pk=pk)
+
    book_inst = get_object_or_404(BookInstance, pk=pk)
 
     # Если это GET (или другой метод), тогда создаём форму по умолчанию
     else:
@@ -276,7 +276,7 @@ def renew_book_librarian(request, pk):
 
 

Если все таки у нас POST-запрос, тогда мы создаём объект с  именем form и заполняем его данными, полученными из запроса. Данный процесс называется связыванием (или, биндингом, от англ. "binding") и позволяет нам провести валидацию данных. Далее осуществляется валидация формы, при этом проверяются все поля формы — для этого используются как код обобщённого класса, так и пользовательских функций, в частности нашей функции проверки введённых дат clean_renewal_date()

-
    book_inst = get_object_or_404(BookInstance, pk=pk)
+
    book_inst = get_object_or_404(BookInstance, pk=pk)
 
     # Если данный запрос типа POST, тогда
     if request.method == 'POST':
@@ -309,7 +309,7 @@ def renew_book_librarian(request, pk):
 
 

Окончательный вид отображения показан ниже. Пожалуйста, скопируйте данный текст в нижнюю часть файла locallibrary/catalog/views.py.

-
from django.contrib.auth.decorators import permission_required
+
from django.contrib.auth.decorators import permission_required
 
 from django.shortcuts import get_object_or_404
 from django.http import HttpResponseRedirect
@@ -352,7 +352,7 @@ def renew_book_librarian(request, pk):
 
 

Создайте шаблон, на который ссылается наше отображение (/catalog/templates/catalog/book_renew_librarian.html) и скопируйте в него код, указанный ниже:

-
{% extends "base_generic.html" %}
+
{% extends "base_generic.html" %}
 {% block content %}
 
     <h1>Renew: \{{bookinst.book.title}}</h1>
@@ -379,7 +379,7 @@ def renew_book_librarian(request, pk):
 
 

Все что осталось, это указать переменную \{{form}}, которую мы передали в шаблон в словаре контекста. Возможно это вас не удивит, но таким образом мы предоставим возможность форме отрендерить свои поля с их метками, виджетами и дополнительными текстами, и в результате мы получим следующее:

-
<tr>
+
<tr>
   <th><label for="id_renewal_date">Renewal date:</label></th>
   <td>
     <input id="id_renewal_date" name="renewal_date" type="text" value="2016-11-08" required />
@@ -395,7 +395,7 @@ def renew_book_librarian(request, pk):
 
 

Если вы ввели неправильную дату, то на странице вы должны получить список сообщений об ошибках (показано жирным ниже).

-
<tr>
+
<tr>
   <th><label for="id_renewal_date">Renewal date:</label></th>
    <td>
       <ul class="errorlist">
@@ -427,7 +427,7 @@ def renew_book_librarian(request, pk):
 
 

Если вы выполнили задание в Django руководство часть 8: Аутентификация и разрешение доступа, то у вас должна быть страница со списком всех книг в наличии библиотеки и данный список (страница) должен быть доступен только её сотрудникам. На данной странице в каждом пункте (для каждой книги) мы можем добавить ссылку на нашу новую страницу обновления книги.

-
{% if perms.catalog.can_mark_returned %}- <a href="{% url 'renew-book-librarian' bookinst.id %}">Renew</a>  {% endif %}
+
{% if perms.catalog.can_mark_returned %}- <a href="{% url 'renew-book-librarian' bookinst.id %}">Renew</a>  {% endif %}

Примечание: Помните что, для того чтобы перейти на страницу обновления книги, ваш тестовый логин должен иметь разрешение доступа типа "catalog.can_mark_returned"(возможно надо воспользоваться вашим аккаунтом для суперпользователя).

@@ -457,7 +457,7 @@ def renew_book_librarian(request, pk):

Базовая реализация ModelForm содержит тоже поле как и ваш предыдущий класс формы  RenewBookForm, что и показано ниже. Все что вам необходимо сделать, - внутри вашего нового класса добавить класс Meta и связать его с моделью model (BookInstance), а затем перечислить поля модели в поле fields которые должны быть включены в форму (вы можете включить все поля при помощи fields = '__all__', или можно воспользоваться полем exclude (вместо fields), чтобы определить поля модели, которые не нужно включать).

-
from django.forms import ModelForm
+
from django.forms import ModelForm
 from .models import BookInstance
 
 class RenewBookModelForm(ModelForm):
@@ -472,7 +472,7 @@ class RenewBookModelForm(ModelForm):
 
 

Оставшаяся часть информации касается объявления полей модели (то есть, текстовых меток, виджетов, текстов, сообщений об ошибках). Если они недостаточно "правильные", то тогда мы можем переопределить их в нашем классе Meta при помощи словаря, содержащего поле, которое надо изменить и его новое значение. Например, в нашей форме мы могли бы поменять текст метки для поля "Renewal date" (вместо того, чтобы оставить текст по умолчанию: Due date), а кроме того мы хотим написать другой вспомогательный текст. Класс Meta, представленный ниже, показывает вам, как переопределить данные поля. Кроме того, при необходимости, вы можете установить значения для виджетов widgets и сообщений об ошибках error_messages.

-
class Meta:
+
class Meta:
     model = BookInstance
     fields = ['due_back',]
     labels = { 'due_back': _('Renewal date'), }
@@ -481,7 +481,7 @@ class RenewBookModelForm(ModelForm):
 
 

Чтобы добавить валидацию, вы можете использовать тот же способ как и для класса Form — вы определяете функцию с именем  clean_field_name() из которой выбрасываете исключение ValidationError, если это необходимо. Единственным отличием от нашей оригинальной формы будет являться то, что поле модели имеет имя due_back, а не "renewal_date".

-
from django.forms import ModelForm
+
from django.forms import ModelForm
 from .models import BookInstance
 
 class RenewBookModelForm(ModelForm):
@@ -522,7 +522,7 @@ class RenewBookModelForm(ModelForm):
 
 

Откройте файл отображений (locallibrary/catalog/views.py) и добавьте следующий код в его нижнюю часть:

-
from django.views.generic.edit import CreateView, UpdateView, DeleteView
+
from django.views.generic.edit import CreateView, UpdateView, DeleteView
 from django.urls import reverse_lazy
 from .models import Author
 
@@ -551,7 +551,7 @@ class AuthorDelete(DeleteView):
 
 

Создайте файл шаблона locallibrary/catalog/templates/catalog/author_form.html  и скопируйте в него следующий текст.

-
{% extends "base_generic.html" %}
+
{% extends "base_generic.html" %}
 
 {% block content %}
 
@@ -569,7 +569,7 @@ class AuthorDelete(DeleteView):
 
 

Отображения "удалить" ожидает "найти" шаблон с именем формата model_name_confirm_delete.html (и снова, вы можете изменить суффикс при помощи поля отображенияtemplate_name_suffix). Создайте файл шаблона locallibrary/catalog/templates/catalog/author_confirm_delete.html и скопируйте в него текст, указанный ниже.

-
{% extends "base_generic.html" %}
+
{% extends "base_generic.html" %}
 
 {% block content %}
 
@@ -589,7 +589,7 @@ class AuthorDelete(DeleteView):
 
 

Откройте файл конфигураций URL-адресов (locallibrary/catalog/urls.py) и добавьте в его нижнюю часть следующие настройки:

-
urlpatterns += [
+
urlpatterns += [
     url(r'^author/create/$', views.AuthorCreate.as_view(), name='author_create'),
     url(r'^author/(?P<pk>\d+)/update/$', views.AuthorUpdate.as_view(), name='author_update'),
     url(r'^author/(?P<pk>\d+)/delete/$', views.AuthorDelete.as_view(), name='author_delete'),
-- 
cgit v1.2.3-54-g00ecf