aboutsummaryrefslogtreecommitdiff
path: root/files/ru/learn/server-side/django/django_assessment_blog
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:42:52 -0500
commit074785cea106179cb3305637055ab0a009ca74f2 (patch)
treee6ae371cccd642aa2b67f39752a2cdf1fd4eb040 /files/ru/learn/server-side/django/django_assessment_blog
parentda78a9e329e272dedb2400b79a3bdeebff387d47 (diff)
downloadtranslated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.gz
translated-content-074785cea106179cb3305637055ab0a009ca74f2.tar.bz2
translated-content-074785cea106179cb3305637055ab0a009ca74f2.zip
initial commit
Diffstat (limited to 'files/ru/learn/server-side/django/django_assessment_blog')
-rw-r--r--files/ru/learn/server-side/django/django_assessment_blog/index.html320
1 files changed, 320 insertions, 0 deletions
diff --git a/files/ru/learn/server-side/django/django_assessment_blog/index.html b/files/ru/learn/server-side/django/django_assessment_blog/index.html
new file mode 100644
index 0000000000..59a1d9e1d2
--- /dev/null
+++ b/files/ru/learn/server-side/django/django_assessment_blog/index.html
@@ -0,0 +1,320 @@
+---
+title: 'Задание: DIY Джанго мини блог'
+slug: Learn/Server-side/Django/django_assessment_blog
+tags:
+ - Аттестация
+ - Бэкэнд
+ - Бэкэнд программирование
+ - Джанго
+ - Изучение
+ - Начинающий
+ - блог
+ - скриптовый кодинг
+translation_of: Learn/Server-side/Django/django_assessment_blog
+---
+<div>{{LearnSidebar}}</div>
+
+<div>{{PreviousMenu("Learn/Server-side/Django/web_application_security", "Learn/Server-side/Django")}}</div>
+
+<p class="summary">В этом задании вы будете оценивать знания Django, которые вы приобрели в <a href="/en-US/docs/Learn/Server-side/Django">Django Web Framework (Python)</a>, чтобы создать очень простой блог.</p>
+
+<table class="learn-box standard-table">
+ <tbody>
+ <tr>
+ <th scope="row">Предпосылки:</th>
+ <td>Перед этим заданием, вы должны были проработать все статьи этого модуля.</td>
+ </tr>
+ <tr>
+ <th scope="row">Задача:</th>
+ <td>Проверить понимание основ Django, включая конфигурации URL, модели, представления, формы и шаблоны.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Краткое_описание_проекта">Краткое описание проекта</h2>
+
+<p>Страницы, которые должны отображаться, их URL-адреса и другие требования, перечислены ниже:</p>
+
+<table class="standard-table">
+ <thead>
+ <tr>
+ <th scope="col">Page</th>
+ <th scope="col">URL</th>
+ <th scope="col">Requirements</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Home page</td>
+ <td><code>/</code> and <code>/blog/</code></td>
+ <td>Страница индекса, описывающая сайт.</td>
+ </tr>
+ <tr>
+ <td>List of all blog posts</td>
+ <td><code>/blog/blogs/</code></td>
+ <td>
+ <p>Список всех сообщений блога:</p>
+
+ <ul>
+ <li>Доступно для всех пользователей из боковой панели.</li>
+ <li>Список отсортирован по дате публикации (от самого нового до самого старого).</li>
+ <li>Список разбит на группы по 5 статьям.</li>
+ <li>Элементы списка отображают название блога, дату публикации и автора.</li>
+ <li>Названия сообщений блога связаны с страницами подробных сведений о блоге.</li>
+ <li>Blogger (имена авторов) связаны с страницами подробных сведений о блоге.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>Blog author (blogger) detail page</td>
+ <td><code>/blog/blogger/<em>&lt;author-id&gt;</em></code></td>
+ <td>
+ <p>Информация для указанного автора (по id) и список постов:</p>
+
+ <ul>
+ <li>Доступен для всех пользователей по ссылкам на автора в сообщениях в блогах и т. Д.</li>
+ <li>Содержит некоторые биографические данные в blogger/author.</li>
+ <li>Список отсортирован по дате добавления (от новых к старым).</li>
+ <li>Не разбит на страницы.</li>
+ <li>Элементы списка отображают только имя сообщения в блоге и дату публикации.</li>
+ <li>Названия блога связаны со страницей блога.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>Blog post detail page</td>
+ <td><code>/blog/<em>&lt;blog-id&gt;</em></code></td>
+ <td>
+ <p>Сведения о блоге.</p>
+
+ <ul>
+ <li>Доступно для всех пользователей из списков блога.</li>
+ <li>Страница содержит сообщение в блоге: имя, автор, дата публикации и содержание.</li>
+ <li>Комментарии к сообщению в блоге должны отображаться внизу.</li>
+ <li>Комментарии должны быть отсортированы по порядку: от старых до самых последних.</li>
+ <li>Содержит ссылку для добавления комментариев на конец для зарегистрированных пользователей (см. Страницу формы комментариев)</li>
+ <li>В блогах и комментариях должен отображаться только обычный текст. Нет необходимости поддерживать какую-либо разметку HTML (например, ссылки, изображения, полужирный / курсив и т. Д.).</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>List of all bloggers</td>
+ <td><code>/blog/bloggers/</code></td>
+ <td>
+ <p>Список блоггеров в системе:</p>
+
+ <ul>
+ <li>Доступный для всех пользователей с боковой панели сайта</li>
+ <li>Имя блогера связано с блогом автора страницы.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>Comment form page</td>
+ <td><code>/blog/<em>&lt;blog-id&gt;</em>/create</code></td>
+ <td>
+ <p>Создать комментарий для публикации в блоге:</p>
+
+ <ul>
+ <li>Доступно только зарегистрированным пользователям (только) из ссылки внизу страницы с подробными сведениями блога.</li>
+ <li>Отображает форму с описанием для ввода комментариев (дата публикации и блог недоступны для редактирования).</li>
+ <li>После того, как комментарий будет опубликован, страница будет перенаправлена ​​на связанную страницу блога.</li>
+ <li>Пользователи не могут редактировать или удалять свои сообщения.</li>
+ <li>Вышедшие пользователи будут перенаправлены на страницу входа в систему, чтобы добавить комментарии. После входа в систему они будут перенаправлены на страницу блога, которую они хотели бы прокомментировать.</li>
+ <li>Страницы комментариев должны содержать имя / ссылку на комментарий блога.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>User authentication pages</td>
+ <td><code>/accounts/<em>&lt;standard urls&gt;</em></code></td>
+ <td>
+ <p>Стандартные страницы аутентификации Django для входа, выхода и установки пароля:</p>
+
+ <ul>
+ <li>Вход / выход должен быть доступен через ссылки боковой панели.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>Admin site</td>
+ <td><code>/admin/<em>&lt;standard urls&gt;</em></code></td>
+ <td>
+ <p>Админ-сайт должен быть включен, чтобы разрешить создание / редактирование / удаление сообщений в блогах, авторов блога и комментариев блога (это механизм для создания блоггеров в блогах):</p>
+
+ <ul>
+ <li>В админ панеле должен отображаться список комментариев в строке (внизу каждого сообщения в блоге).</li>
+ <li>Имена комментариев в админке создаются усеканием описания комментария до 75 знаков</li>
+ <li>Другие типы записей могут использовать базовую регистрацию.</li>
+ </ul>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<p>Кроме того, вы должны написать некоторые базовые тесты для проверки:</p>
+
+<ul>
+ <li>Все поля модели имеют правильную метку и длину.</li>
+ <li>Все модели имеют ожидаемое имя объекта (например,<code> __str__()</code>выдает ожидаемое значение).</li>
+ <li>Модели имеют ожидаемый URL для отдельных записей в блогах и комментариях (например,<code>get_absolute_url()</code> возвращает ожидаемый URL-адрес).</li>
+ <li>Страница BlogListView (страница на всех блогах) доступна в ожидаемом месте (например, /blog/blogs)</li>
+ <li>Страница BlogListView (страница на всех блогах) доступна на ожидаемом именованном URL-адресе (например, 'blogs')</li>
+ <li>Страница BlogListView (страница на всех блогах) использует ожидаемый шаблон (например, по умолчанию)</li>
+ <li>BlogListView разбивает записи на 5 (по крайней мере, на первой странице)</li>
+</ul>
+
+<div class="note">
+<p><strong>Заметка</strong>: Конечно, есть много других тестов, которые вы можете запустить. Используйте на свое усмотрение, но мы ожидаем, что вы сделаете хотя бы тесты выше.</p>
+</div>
+
+<p>В следующем разделе показаны <a href="#Screenshots">скриншоты</a> сайта, который выполняет перечисленные выше требования.</p>
+
+<h2 id="Скриншоты">Скриншоты</h2>
+
+<p>Следующий скриншот - пример того, что должна выводить готовая программа.</p>
+
+<h3 id="Список_всех_сообщений_в_блоге">Список всех сообщений в блоге</h3>
+
+<p>Это отображает список всех сообщений в блоге (доступны из ссылки "All blogs" на боковой панели). Что нужно отметить:</p>
+
+<ul>
+ <li>На боковой панели также списки вошедшего в систему пользователя.</li>
+ <li>Индивидуальные блоги и блогеры доступны в виде ссылок на странице.</li>
+ <li>Разбивка включена (в группах по 5)</li>
+ <li>Показ от новых к старым.</li>
+</ul>
+
+<p><img alt="List of all blogs" src="https://mdn.mozillademos.org/files/14319/diyblog_allblogs.png" style="border-style: solid; border-width: 1px; display: block; height: 363px; margin: 0px auto; width: 986px;"></p>
+
+<h3 id="Список_всех_блоггеров">Список всех блоггеров</h3>
+
+<p> </p>
+
+<p>Это ссылки на всех блоггеров в "All bloggers" по ссылке, которая на боковой панели. В этом случае мы можем увидеть на боковой панели, что ни один пользователь не вошел в систему.</p>
+
+<p><img alt="List of all bloggers" src="https://mdn.mozillademos.org/files/14321/diyblog_blog_allbloggers.png" style="border-style: solid; border-width: 1px; display: block; height: 256px; margin: 0px auto; width: 493px;"></p>
+
+<h3 id="Подробная_страница_блога">Подробная страница блога</h3>
+
+<p>Это показывает подробную страницу для конкретного блога.</p>
+
+<p><img alt="Blog detail with add comment link" src="https://mdn.mozillademos.org/files/14323/diyblog_blog_detail_add_comment.png" style="border-style: solid; border-width: 1px; display: block; height: 640px; margin: 0px auto; width: 986px;"></p>
+
+<p>Обратите внимание, что комментарии имеют дату <em>и</em> время, и расположены в порядке от самых старых до новейших (противоположно порядку ведения блога). В конце у нас есть ссылка для доступа к форме, чтобы добавить новый комментарий. Если пользователь не вошел в систему, мы бы увидели предложение войти в систему.</p>
+
+<p><img alt="Comment link when not logged in" src="https://mdn.mozillademos.org/files/14325/diyblog_blog_detail_not_logged_in.png" style="border-style: solid; border-width: 1px; display: block; height: 129px; margin: 0px auto; width: 646px;"></p>
+
+<h3 id="Добавить_форму_комментария">Добавить форму комментария</h3>
+
+<p>Это форма добавления комментариев. Обратите внимание, что мы вошли в систему. Когда это удастся, мы должны вернуться к связанной странице блога.</p>
+
+<p><img alt="Add comment form" src="https://mdn.mozillademos.org/files/14329/diyblog_comment_form.png" style="border-style: solid; border-width: 1px; display: block; height: 385px; margin: 0px auto; width: 778px;"></p>
+
+<h3 id="Об_авторе">Об авторе</h3>
+
+<p>Здесь отображается информация о блоггере вместе со списком его блогов.</p>
+
+<p><img alt="Blogger detail page" src="https://mdn.mozillademos.org/files/14327/diyblog_blogger_detail.png" style="border-style: solid; border-width: 1px; display: block; height: 379px; margin: 0px auto; width: 982px;"></p>
+
+<h2 id="Завершающие_шаги">Завершающие шаги</h2>
+
+<p>В следующих разделах описывается, что вам нужно делать.</p>
+
+<ol>
+ <li>Создайте скелет проекта и веб-приложение для сайта (как описано в  <a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">Django Tutorial Part 2: Creating a skeleton website</a>). Вы можете использовать «diyblog» для имени проекта и «blog» для имени приложения.</li>
+ <li>Создавайте модели для записей в блогах, комментариев и любых других необходимых объектов.
+ <ul>
+ <li>Каждый комментарий будет иметь только один блог, но блог может иметь много комментариев.</li>
+ <li>Посты в блоге и комментарии должны быть отсортированы по дате поста.</li>
+ <li>Не каждый пользователь обязательно будет автором блога, хотя любой пользователь может быть комментатором.</li>
+ <li>Блог автора также должен включать информацию о себе.</li>
+ </ul>
+ </li>
+ <li>Запустите миграцию для новых моделей и создайте суперпользователя.</li>
+ <li>Используйте админ панель, чтобы создать какой-нибудь пример блога и комментарии в блогах.</li>
+ <li>Создайте представления, шаблоны, и URL-конфигурации для публикации блога и списка страниц блоггера.</li>
+ <li>Создайте представления, шаблоны, и URL-конфигурации для публикации блога и подробных страниц блоггера.</li>
+ <li>Создайте страницу с формой для добавления новых комментариев (не забудьте сделать это доступным только для зарегистрированных пользователей!)</li>
+</ol>
+
+<h2 id="Советы_и_подсказки">Советы и подсказки</h2>
+
+<p>Этот проект очень похож на  <a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">LocalLibrary</a> учебник. Вы сможете настроить скелет, поведение входа пользователя / выхода из системы, поддержку статических файлов, представлений, URL-адресов, форм, базовых шаблонов и конфигурации админ-панели, используя почти все те же подходы.</p>
+
+<p>Некоторые общие рекомендации:</p>
+
+<ol>
+ <li>Индексная страница (index page) может быть реализована в качестве основной функции представления и шаблона (как и для locallibrary).</li>
+ <li>Просмотр списка публикаций блога и блогеров, а также подробное представление для сообщений в блоге можно создать с помощью  <a href="/en-US/docs/Learn/Server-side/Django/Generic_views">generic list and detail views</a>.</li>
+ <li>Список постов в блоге конкретного автора может быть создан с помощью общего списка Blog list view и фильтрация для объекта блога, соответствующего указанному автору.
+ <ul>
+ <li>Вам придется реализовать  <code>get_queryset(self)</code> для фильтрации (как и в нашем классе библиотеки <code>LoanedBooksAllListView</code>) и получить информацию об авторе из URL-адреса.</li>
+ <li>Вам также необходимо передать имя автора на страницу в контексте. Чтобы сделать это в представлении на основе классов, вам необходимо реализовать  <code>get_context_data()</code> (обсуждается ниже).</li>
+ </ul>
+ </li>
+ <li>Форма <em>добавления комментариев</em> может быть создана с использованием функционального представления (и связанной модели и формы) или с использованием общего <code>CreateView</code>. Если вы используете <code>CreateView</code> (рекомендуется):
+ <ul>
+ <li>Вам также нужно будет передать имя блога на страницу комментариев в контексте (реализовать  <code>get_context_data()</code> как обсуждается ниже).</li>
+ <li>Форма должна отображать только комментарий «описание» для записи пользователя (дата и связанная с ними запись в блоге не должны редактироваться). Поскольку они не будут в форме, ваш код должен будет установить автора комментария в <code> form_valid()</code> функцию, поэтому он может быть сохранен в модели (<a href="https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user">as described here</a> — Django docs). В этой же функции мы устанавливаем связанный блог. Возможная реализация показана ниже (<code>pk</code> это идентификатор блога, переданный из URL / URL конфигурации ).
+ <pre class="brush: python"> def form_valid(self, form):
+ """
+ Add author and associated blog to form data before setting it as valid (so it is saved to model)
+ """
+ #Add logged-in user as author of comment
+ form.instance.author = self.request.user
+ #Associate comment with blog based on passed id
+ form.instance.blog=get_object_or_404(Blog, pk = self.kwargs['pk'])
+ # Call super-class form validation behaviour
+ return super(BlogCommentCreate, self).form_valid(form)
+</pre>
+ </li>
+ <li> Для успешного перенаправления после проверки формы вам нужно будет указать URL-адрес;  это должен быть оригинальный блог. Для этого вам нужно будет переопределить  <code>get_success_url()</code> и «обратный» URL-адрес для исходного блога. Вы можете получить требуемый ID блога, используя <code>self.kwargs</code> атрибут, как показано в методе <code>form_valid()</code> выше.</li>
+ </ul>
+ </li>
+</ol>
+
+<p>Мы кратко говорили о передаче контекста шаблону в представлении на основе классов в теме  <a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views#Overriding_methods_in_class-based_views">Django Tutorial Part 6: Generic list and detail views</a>. Для этого вам нужно переопределить <code>get_context_data()</code> (сначала получить существующий контекст, обновить его любыми дополнительными переменными, которые вы хотите передать шаблону, а затем вернуть обновленный контекст). Например, фрагмент кода ниже показывает, как вы можете добавить объект blogger в контекст на основе его <code>BlogAuthor</code> id.</p>
+
+<pre class="brush: python">class SomeView(generic.ListView):
+ ...
+
+ def get_context_data(self, **kwargs):
+        # Call the base implementation first to get a context
+        context = super(SomeView, self).get_context_data(**kwargs)
+        # Get the blogger object from the "pk" URL parameter and add it to the context
+        context['blogger'] = get_object_or_404(BlogAuthor, pk = self.kwargs['pk'])
+        return context
+</pre>
+
+<h2 id="Аттестация">Аттестация</h2>
+
+<p>Оценка этого задания <a href="https://github.com/mdn/django-diy-blog/blob/master/MarkingGuide.md">доступна здесь на Github</a>. Эта оценка в основном основана на том, насколько хорошо ваше приложение соответствует требованиям, перечисленным выше, хотя есть некоторые части оценки, которые проверяют ваш код на использование соответствующих моделей и что вы написали хотя бы некоторый тестовый код. Когда вы закончите, вы можете проверить по нашему <a href="https://github.com/mdn/django-diy-blog">готовому примеру</a> который соответствует "высокой оценке проекта".</p>
+
+<p>После того, как вы завершили этот модуль, вы также закончили весь контент MDN для изучения базового веб-сайта на сервере Django! Надеемся, вам понравится этот модуль и вы почувствуете, что у вас есть хорошее понимание основ!</p>
+
+<p>{{PreviousMenu("Learn/Server-side/Django/web_application_security", "Learn/Server-side/Django")}}</p>
+
+<p> </p>
+
+<h2 id="В_этом_модуле">В этом модуле</h2>
+
+<ul>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Introduction">Django introduction</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/development_environment">Setting up a Django development environment</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">Django Tutorial: The Local Library website</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">Django Tutorial Part 2: Creating a skeleton website</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Models">Django Tutorial Part 3: Using models</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Admin_site">Django Tutorial Part 4: Django admin site</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Home_page">Django Tutorial Part 5: Creating our home page</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Generic_views">Django Tutorial Part 6: Generic list and detail views</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Sessions">Django Tutorial Part 7: Sessions framework</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Authentication">Django Tutorial Part 8: User authentication and permissions</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Forms">Django Tutorial Part 9: Working with forms</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Testing">Django Tutorial Part 10: Testing a Django web application</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/Deployment">Django Tutorial Part 11: Deploying Django to production</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/web_application_security">Django web application security</a></li>
+ <li><a href="/en-US/docs/Learn/Server-side/Django/django_assessment_blog">DIY Django mini blog</a></li>
+</ul>
+
+<p> </p>