Задание: DIY Django мини блог
=============================

* Назад
* Обзор: Django

В этом задании вы будете оценивать знания Django, которые вы приобрели в Django Web Framework (Python), чтобы создать очень простой блог.

| Предпосылки: | Перед этим заданием, вы должны были проработать все статьи этого модуля. |
| --- | --- |
| Задача: | Проверить понимание основ Django, включая конфигурации URL, модели, представления, формы и шаблоны. |

Краткое описание проекта
------------------------

Страницы, которые должны отображаться, их URL-адреса и другие требования, перечислены ниже:

| Page | URL | Requirements |
| --- | --- | --- |
| Home page | `/` and `/blog/` | Страница индекса, описывающая сайт. |
| List of all blog posts | `/blog/blogs/` | Список всех сообщений блога:* Доступно для всех пользователей из боковой панели.
* Список отсортирован по дате публикации (от самого нового до самого
 старого).
* Список разбит на группы по 5 статьям.
* Элементы списка отображают название блога, дату публикации и автора.
* Названия сообщений блога связаны с страницами подробных сведений о
 блоге.
* Blogger (имена авторов) связаны с страницами подробных сведений о
 блоге.
 |
| Blog author (blogger) detail page | `/blog/blogger/*<author-id>*` | Информация для указанного автора (по id) и список постов:* Доступен для всех пользователей по ссылкам на автора в сообщениях в
 блогах и т. Д.
* Содержит некоторые биографические данные в blogger/author.
* Список отсортирован по дате добавления (от новых к старым).
* Не разбит на страницы.
* Элементы списка отображают только имя сообщения в блоге и дату
 публикации.
* Названия блога связаны со страницей блога.
 |
| Blog post detail page | `/blog/*<blog-id>*` | Сведения о блоге.* Доступно для всех пользователей из списков блога.
* Страница содержит сообщение в блоге: имя, автор, дата публикации и
 содержание.
* Комментарии к сообщению в блоге должны отображаться внизу.
* Комментарии должны быть отсортированы по порядку: от старых до самых
 последних.
* Содержит ссылку для добавления комментариев на конец для
 зарегистрированных пользователей (см. Страницу формы комментариев)
* В блогах и комментариях должен отображаться только обычный текст.
 Нет необходимости поддерживать какую-либо разметку HTML (например,
 ссылки, изображения, полужирный / курсив и т. Д.).
 |
| List of all bloggers | `/blog/bloggers/` | Список блогеров в системе:* Доступный для всех пользователей с боковой панели сайта
* Имя блогера связано с блогом автора страницы.
 |
| Comment form page | `/blog/*<blog-id>*/create` | Создать комментарий для публикации в блоге:* Доступно только зарегистрированным пользователям (только) из ссылки
 внизу страницы с подробными сведениями блога.
* Отображает форму с описанием для ввода комментариев (дата публикации
 и блог недоступны для редактирования).
* После того, как комментарий будет опубликован, страница будет
 перенаправлена на связанную страницу блога.
* Пользователи не могут редактировать или удалять свои сообщения.
* Вышедшие пользователи будут перенаправлены на страницу входа в
 систему, чтобы добавить комментарии. После входа в систему они будут
 перенаправлены на страницу блога, которую они хотели бы
 прокомментировать.
* Страницы комментариев должны содержать имя / ссылку на комментарий
 блога.
 |
| User authentication pages | `/accounts/*<standard urls>*` | 
 Стандартные страницы аутентификации Django для входа, выхода и
 установки пароля:
 * Вход / выход должен быть доступен через ссылки боковой панели.
 |
| Admin site | `/admin/*<standard urls>*` | 
 Админ-сайт должен быть включён, чтобы разрешить создание /
 редактирование / удаление сообщений в блогах, авторов блога и
 комментариев блога (это механизм для создания блогеров в блогах):
 * В админ панеле должен отображаться список комментариев в строке
 (внизу каждого сообщения в блоге).
* Имена комментариев в админке создаются усеканием описания
 комментария до 75 знаков
* Другие типы записей могут использовать базовую регистрацию.
 |

Кроме того, вы должны написать некоторые базовые тесты для проверки:

* Все поля модели имеют правильную метку и длину.
* Все модели имеют ожидаемое имя объекта (например, `__str__()` выдаёт ожидаемое значение).
* Модели имеют ожидаемый URL для отдельных записей в блогах и комментариях (например, `get_absolute_url()` возвращает ожидаемый URL-адрес).
* Страница BlogListView (страница на всех блогах) доступна в ожидаемом месте (например, /blog/blogs)
* Страница BlogListView (страница на всех блогах) доступна на ожидаемом именованном URL-адресе (например, 'blogs')
* Страница BlogListView (страница на всех блогах) использует ожидаемый шаблон (например, по умолчанию)
* BlogListView разбивает записи на 5 (по крайней мере, на первой странице)

**Примечание:** Конечно, есть много других тестов, которые вы можете запустить. Используйте на своё усмотрение, но мы ожидаем, что вы сделаете хотя бы тесты выше.

В следующем разделе показаны скриншоты сайта, который выполняет перечисленные выше требования.

Скриншоты
---------

Следующий скриншот - пример того, что должна выводить готовая программа.

### Список всех сообщений в блоге

Это отображает список всех сообщений в блоге (доступны из ссылки "All blogs" на боковой панели). Что нужно отметить:

* На боковой панели также списки вошедшего в систему пользователя.
* Индивидуальные блоги и блогеры доступны в виде ссылок на странице.
* Разбивка включена (в группах по 5)
* Показ от новых к старым.

![List of all blogs](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_allblogs.png)

### Список всех блогеров

Это ссылки на всех блогеров в "All bloggers" по ссылке, которая на боковой панели. В этом случае мы можем увидеть на боковой панели, что ни один пользователь не вошёл в систему.

![List of all bloggers](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_blog_allbloggers.png)

### Подробная страница блога

Это показывает подробную страницу для конкретного блога.

![Blog detail with add comment link](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_blog_detail_add_comment.png)

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

![Comment link when not logged in](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_blog_detail_not_logged_in.png)

### Добавить форму комментария

Это форма добавления комментариев. Обратите внимание, что мы вошли в систему. Когда это удастся, мы должны вернуться к связанной странице блога.

![Add comment form](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_comment_form.png)

### Об авторе

Здесь отображается информация о блогере вместе со списком его блогов.

![Blogger detail page](/ru/docs/Learn/Server-side/Django/django_assessment_blog/diyblog_blogger_detail.png)

Завершающие шаги
----------------

В следующих разделах описывается, что вам нужно делать.

1. Создайте скелет проекта и веб-приложение для сайта (как описано в Django Tutorial Part 2: Creating a skeleton website). Вы можете использовать «diyblog» для имени проекта и «blog» для имени приложения.
2. Создавайте модели для записей в блогах, комментариев и любых других необходимых объектов.
    * Каждый комментарий будет иметь только один блог, но блог может иметь много комментариев.
    * Посты в блоге и комментарии должны быть отсортированы по дате поста.
    * Не каждый пользователь обязательно будет автором блога, хотя любой пользователь может быть комментатором.
    * Блог автора также должен включать информацию о себе.
3. Запустите миграцию для новых моделей и создайте суперпользователя.
4. Используйте админ панель, чтобы создать какой-нибудь пример блога и комментарии в блогах.
5. Создайте представления, шаблоны, и URL-конфигурации для публикации блога и списка страниц блогера.
6. Создайте представления, шаблоны, и URL-конфигурации для публикации блога и подробных страниц блогера.
7. Создайте страницу с формой для добавления новых комментариев (не забудьте сделать это доступным только для зарегистрированных пользователей!)
Советы и подсказки
------------------

Этот проект очень похож на LocalLibrary учебник. Вы сможете настроить скелет, поведение входа пользователя / выхода из системы, поддержку статических файлов, представлений, URL-адресов, форм, базовых шаблонов и конфигурации админ-панели, используя почти все те же подходы.

Некоторые общие рекомендации:

1. Индексная страница (index page) может быть реализована в качестве основной функции представления и шаблона (как и для locallibrary).
2. Просмотр списка публикаций блога и блогеров, а также подробное представление для сообщений в блоге можно создать с помощью generic list and detail views.
3. Список постов в блоге конкретного автора может быть создан с помощью общего списка Blog list view и фильтрация для объекта блога, соответствующего указанному автору.
    * Вам придётся реализовать `get_queryset(self)` для фильтрации (как и в нашем классе библиотеки `LoanedBooksAllListView`) и получить информацию об авторе из URL-адреса.
    * Вам также необходимо передать имя автора на страницу в контексте. Чтобы сделать это в представлении на основе классов, вам необходимо реализовать `get_context_data()` (обсуждается ниже).
4. Форма *добавления комментариев* может быть создана с использованием функционального представления (и связанной модели и формы) или с использованием общего `CreateView`. Если вы используете `CreateView` (рекомендуется):
    * Вам также нужно будет передать имя блога на страницу комментариев в контексте (реализовать `get_context_data()` как обсуждается ниже).
    * Форма должна отображать только комментарий «описание» для записи пользователя (дата и связанная с ними запись в блоге не должны редактироваться). Поскольку они не будут в форме, ваш код должен будет установить автора комментария в `form_valid()` функцию, поэтому он может быть сохранён в модели (as described here — Django docs). В этой же функции мы устанавливаем связанный блог. Возможная реализация показана ниже (`pk` это идентификатор блога, переданный из URL / URL конфигурации ).
     python
    ```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)
    
    ```
    * Для успешного перенаправления после проверки формы вам нужно будет указать URL-адрес; это должен быть оригинальный блог. Для этого вам нужно будет переопределить `get_success_url()` и «обратный» URL-адрес для исходного блога. Вы можете получить требуемый ID блога, используя `self.kwargs` атрибут, как показано в методе `form_valid()` выше.

Мы кратко говорили о передаче контекста шаблону в представлении на основе классов в теме Django Tutorial Part 6: Generic list and detail views. Для этого вам нужно переопределить `get_context_data()` (сначала получить существующий контекст, обновить его любыми дополнительными переменными, которые вы хотите передать шаблону, а затем вернуть обновлённый контекст). Например, фрагмент кода ниже показывает, как вы можете добавить объект blogger в контекст на основе его `BlogAuthor` id.


```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
```

Аттестация
----------

Оценка этого задания доступна здесь на Github. Эта оценка в основном основана на том, насколько хорошо ваше приложение соответствует требованиям, перечисленным выше, хотя есть некоторые части оценки, которые проверяют ваш код на использование соответствующих моделей и что вы написали хотя бы некоторый тестовый код. Когда вы закончите, вы можете проверить по нашему готовому примеру который соответствует "высокой оценке проекта".

После того, как вы завершили этот модуль, вы также закончили весь контент MDN для изучения базового веб-сайта на сервере Django! Надеемся, вам понравится этот модуль и вы почувствуете, что у вас есть хорошее понимание основ!

* Назад
* Обзор: Django