Задание: DIY Django мини блог
В этом задании вы будете оценивать знания Django, которые вы приобрели в Django Web Framework (Python), чтобы создать очень простой блог.
Предпосылки: | Перед этим заданием, вы должны были проработать все статьи этого модуля. |
---|---|
Задача: | Проверить понимание основ Django, включая конфигурации URL, модели, представления, формы и шаблоны. |
Краткое описание проекта
Страницы, которые должны отображаться, их URL-адреса и другие требования, перечислены ниже:
Page | URL | Requirements |
---|---|---|
Home page | / and /blog/ |
Страница индекса, описывающая сайт. |
List of all blog posts | /blog/blogs/ |
Список всех сообщений блога:
|
Blog author (blogger) detail page | /blog/blogger/<author-id> |
Информация для указанного автора (по id) и список постов:
|
Blog post detail page | /blog/<blog-id> |
Сведения о блоге.
|
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> |
Админ-сайт должен быть включён, чтобы разрешить создание / редактирование / удаление сообщений в блогах, авторов блога и комментариев блога (это механизм для создания блогеров в блогах):
|
Кроме того, вы должны написать некоторые базовые тесты для проверки:
- Все поля модели имеют правильную метку и длину.
- Все модели имеют ожидаемое имя объекта (например,
__str__()
выдаёт ожидаемое значение). - Модели имеют ожидаемый URL для отдельных записей в блогах и комментариях (например,
get_absolute_url()
возвращает ожидаемый URL-адрес). - Страница BlogListView (страница на всех блогах) доступна в ожидаемом месте (например, /blog/blogs)
- Страница BlogListView (страница на всех блогах) доступна на ожидаемом именованном URL-адресе (например, 'blogs')
- Страница BlogListView (страница на всех блогах) использует ожидаемый шаблон (например, по умолчанию)
- BlogListView разбивает записи на 5 (по крайней мере, на первой странице)
Примечание: Конечно, есть много других тестов, которые вы можете запустить. Используйте на своё усмотрение, но мы ожидаем, что вы сделаете хотя бы тесты выше.
В следующем разделе показаны скриншоты сайта, который выполняет перечисленные выше требования.
Скриншоты
Следующий скриншот - пример того, что должна выводить готовая программа.
Список всех сообщений в блоге
Это отображает список всех сообщений в блоге (доступны из ссылки "All blogs" на боковой панели). Что нужно отметить:
- На боковой панели также списки вошедшего в систему пользователя.
- Индивидуальные блоги и блогеры доступны в виде ссылок на странице.
- Разбивка включена (в группах по 5)
- Показ от новых к старым.
Список всех блогеров
Это ссылки на всех блогеров в "All bloggers" по ссылке, которая на боковой панели. В этом случае мы можем увидеть на боковой панели, что ни один пользователь не вошёл в систему.
Подробная страница блога
Это показывает подробную страницу для конкретного блога.
Обратите внимание, что комментарии имеют дату и время, и расположены в порядке от самых старых до новейших (противоположно порядку ведения блога). В конце у нас есть ссылка для доступа к форме, чтобы добавить новый комментарий. Если пользователь не вошёл в систему, мы бы увидели предложение войти в систему.
Добавить форму комментария
Это форма добавления комментариев. Обратите внимание, что мы вошли в систему. Когда это удастся, мы должны вернуться к связанной странице блога.
Об авторе
Здесь отображается информация о блогере вместе со списком его блогов.
Завершающие шаги
В следующих разделах описывается, что вам нужно делать.
-
Создайте скелет проекта и веб-приложение для сайта (как описано в Django Tutorial Part 2: Creating a skeleton website). Вы можете использовать «diyblog» для имени проекта и «blog» для имени приложения.
-
Создавайте модели для записей в блогах, комментариев и любых других необходимых объектов.
- Каждый комментарий будет иметь только один блог, но блог может иметь много комментариев.
- Посты в блоге и комментарии должны быть отсортированы по дате поста.
- Не каждый пользователь обязательно будет автором блога, хотя любой пользователь может быть комментатором.
- Блог автора также должен включать информацию о себе.
-
Запустите миграцию для новых моделей и создайте суперпользователя.
-
Используйте админ панель, чтобы создать какой-нибудь пример блога и комментарии в блогах.
-
Создайте представления, шаблоны, и URL-конфигурации для публикации блога и списка страниц блогера.
-
Создайте представления, шаблоны, и URL-конфигурации для публикации блога и подробных страниц блогера.
-
Создайте страницу с формой для добавления новых комментариев (не забудьте сделать это доступным только для зарегистрированных пользователей!)
Советы и подсказки
Этот проект очень похож на LocalLibrary учебник. Вы сможете настроить скелет, поведение входа пользователя / выхода из системы, поддержку статических файлов, представлений, URL-адресов, форм, базовых шаблонов и конфигурации админ-панели, используя почти все те же подходы.
Некоторые общие рекомендации:
-
Индексная страница (index page) может быть реализована в качестве основной функции представления и шаблона (как и для locallibrary).
-
Просмотр списка публикаций блога и блогеров, а также подробное представление для сообщений в блоге можно создать с помощью generic list and detail views.
-
Список постов в блоге конкретного автора может быть создан с помощью общего списка Blog list view и фильтрация для объекта блога, соответствующего указанному автору.
- Вам придётся реализовать
get_queryset(self)
для фильтрации (как и в нашем классе библиотекиLoanedBooksAllListView
) и получить информацию об авторе из URL-адреса. - Вам также необходимо передать имя автора на страницу в контексте. Чтобы сделать это в представлении на основе классов, вам необходимо реализовать
get_context_data()
(обсуждается ниже).
- Вам придётся реализовать
-
Форма добавления комментариев может быть создана с использованием функционального представления (и связанной модели и формы) или с использованием общего
CreateView
. Если вы используетеCreateView
(рекомендуется):-
Вам также нужно будет передать имя блога на страницу комментариев в контексте (реализовать
get_context_data()
как обсуждается ниже). -
Форма должна отображать только комментарий «описание» для записи пользователя (дата и связанная с ними запись в блоге не должны редактироваться). Поскольку они не будут в форме, ваш код должен будет установить автора комментария в
form_valid()
функцию, поэтому он может быть сохранён в модели (as described here — Django docs). В этой же функции мы устанавливаем связанный блог. Возможная реализация показана ниже (pk
это идентификатор блога, переданный из URL / URL конфигурации ).pythondef 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.
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! Надеемся, вам понравится этот модуль и вы почувствуете, что у вас есть хорошее понимание основ!