Автор оригинала: Arun Ravindran.
Вы читаете пост из серии руководств, состоящей из четырех частей.
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Кажется, прошло много времени с тех пор, как вышла вторая часть. Тем временем фильм Человек из стали действительно был выпущен. Так что нет необходимости проверять слухи о том, о чем этот фильм. Возможно, индустрия сейчас гудит слухами о его продолжении.
В этом руководстве я хотел бы показать, как использовать такие функции, как комментарии и представления CRUD , которые являются неотъемлемой частью социальный сайт. Вы можете посмотреть видео или прочитать пошаговое описание ниже или следовать обоим. пакет вкусностей , который был представлен в последней части, был обновлен и будет снова использоваться для сохранения время создавать шаблоны.
Это видео будет продолжением предыдущего, и я рекомендую его посмотреть. Нажмите на изображение ниже, чтобы посмотреть скринкаст, или прокрутите вниз, чтобы прочитать шаги.
Понравился этот урок? Тогда вам следует подписаться на мою готовящуюся к выпуску книгу «Создание сайта социальных новостей на Django» . Он пытается объяснить в стиле учиться у друга , как создаются веб-сайты, и постепенно затрагивает сложные темы, такие как тестирование, безопасность, миграция баз данных и отладка.
Пошаговая инструкция
Вот текстовая версия видео для людей, предпочитающих читать. Во второй части мы показали вам, как создать сайт, похожий на бета-версию, чтобы публиковать слухи о “Человеке из стали” , где пользователи могут зарегистрироваться и создавать свои собственные профили.
План части 3 скринкаста таков:
- Структура комментариев
- Создание/чтение/обновление/удаление ссылки
- Пагинация
Получите снова набор вкусностей
Пакет вкусностей изменился со времени последнего урока, поэтому я бы рекомендовал загрузить его снова.
Загрузите sr-goodies-master.zip в любое удобное место. В Linux вы можете использовать следующие команды, чтобы извлечь его в каталог /tmp
.
cd /tmp
wget https://github.com/arocks/sr-goodies/archive/master.zip
unzip master.zip
Изучите извлеченные файлы в /tmp/sr-goodies-master
Пагинация
Пока что мы видим только первую страницу списка ссылок. Но мы используем Django ListView
, который обеспечивает разбиение на страницы. Давайте реализуем простую ссылку «Далее», чтобы перейти на следующую страницу.
Добавьте следующий фрагмент в steelrumors/templates/links/link_list.html
непосредственно перед {% endblock%}
:
{% if is_paginated %}
{% if page_obj.has_next %}
More »
{% endif %}
{% endif %}
В том же файле шаблона нам нужно изменить первый тег
, чтобы обеспечить правильное отображение номеров строк на странице 2 и более поздних. Замените эту строку на
следующими строками:
{% if is_paginated %}
{{ page_obj.start_index }}">
{% else %}
{% endif %}
Теперь вы можете посетить каждую страницу и прочитать каждую отправленную ссылку!
CRUD – создание и чтение ссылок
Мы использовали интерфейс администратора для создания/обновления/удаления ссылок. Но это доступно только сотрудникам. Чтобы пользователи могли отправлять ссылки, нам потребуются новая форма, новый класс представления (общий CBV) и новый шаблон с формой.
Add this new ModelForm to `links/forms.py`:
from .models import Link
...
class LinkForm(forms.ModelForm):
class Meta:
model Link
exclude ("submitter", "rank_score")
Пришло время реализовать “C” CRUD, импортировав CreateView
и только что созданную форму:
Add the `LinkCreateView` class to `links/views.py`:
from django.views.generic.edit import CreateView
from .forms import LinkForm
...
class LinkCreateView(CreateView):
model Link
form_class LinkForm
def form_valid(self, form):
f form.save(commitFalse)
f.rank_score 0.0
f.submitter self.request.user
f.save()
return super(CreateView, self).form_valid(form)
Скопируйте link_form.html
from goodies в steelrumors/templates/links/link_form.html
:
cp /tmp/sr-goodies-master/templates/links/link_form.html \
~/proj/steelrumors/steelrumors/templates/links/
Добавьте это представление в steelrumours/urls.py
:
from links.views import LinkCreateView
url(r'^link/create/$', auth(LinkCreateView.as_view()),
name'link_create'),
Посетите http://127.0.0.1:8000/link/create/ и отправьте новую ссылку. Помните, что вам необходимо войти в систему, чтобы отправлять ссылки.
Если вы попытаетесь отправить ссылку, вы увидите сообщение об ошибке с просьбой «либо предоставить URL-адрес, либо определить метод get_absolute_url
в модели». Итак, давайте определим метод get_absolute_url
.
Добавьте следующий метод в класс Link
:
from django.core.urlresolvers import reverse
...
def get_absolute_url(self):
return reverse("link_detail", kwargs={"pk": str(self.id)})
Создайте DetailView в links/views.py
. Это буква «R» CRUD.
from django.views.generic import DetailView
...
class LinkDetailView(DetailView):
model Link
Скопируйте link_detail.html
из goodies в steelrumors/templates/links/link_detail.html
:
cp /tmp/sr-goodies-master/templates/links/link_detail.html \
~/proj/steelrumors/templates/links/
Добавьте это подробное представление в steelrumours/urls.py
:
from links.views import LinkDetailView
url(r'^link/(?P\d+)/$', LinkDetailView.as_view(),
name'link_detail'),
Попробуйте отправить форму добавления ссылки еще раз, и она должна без ошибок перенаправить вас на страницу с подробными сведениями.
Для удобства давайте добавим URL-адреса к этим новым представлениям в нашем шаблоне, чтобы пользователи могли легко их найти. Добавьте в base.html
только строку со знаком + (удалите знак +):
{% if user.is_authenticated %}
+ Submit Link |
Logout |
Внесите следующие изменения (измененная строка начинается со знака +) в steelrumors/templates/links/link_list.html
:
{% for link in object_list %}
[{{ link.votes }}]
+
{{ link.title }}
Обновите сайт steelrumours в своем браузере и проверьте, все ли ссылки работают правильно.
CRUD – Обновление и удаление
Остальные два представления для обновления и удаления просты, и мы можем сложить их вместе. Мы собираемся повторно использовать LinkForm, поэтому начнем с представлений.
Добавьте эти классы представлений в links/views.py
:
from django.core.urlresolvers import reverse_lazy
from django.views.generic.edit import UpdateView
from django.views.generic.edit import DeleteView
...
class LinkUpdateView(UpdateView):
model = Link
form_class = LinkForm
class LinkDeleteView(DeleteView):
model = Link
success_url = reverse_lazy("home")
Скопируйте link_confirm_delete.html
из подарков в steelrumors/templates/links/link_confirm_delete.html
:
cp /tmp/sr-goodies-master/templates/links/link_confirm_delete.html \
~/proj/steelrumors/templates/links/
Добавьте эти представления в steelrumours/urls.py
:
from links.views import LinkUpdateView
from links.views import LinkDeleteView
url(r'^link/update/(?P\d+)/$', auth(LinkUpdateView.as_view()),
name'link_update'),
url(r'^link/delete/(?P\d+)/$', auth(LinkDeleteView.as_view()),
name'link_delete'),
Наконец, для удобства добавьте эти строки (со знаком +) в steelrumors/templates/links/link_detail.html
:
{{ object.title }}
+ {% if object.submitter user %}
+ Edit |
+ Delete
+ {% endif %}
Теперь вы можете создавать, читать, обновлять и удалять объекты Link. Попытайся!
Включение комментариев
Мы собираемся добавить комментарии к страницам с подробными сведениями о ссылках, используя встроенный фреймворк комментариев Django. Сначала добавьте эти приложения в steelrumors/settings.py
:
INSTALLED_APPS (
'django.contrib.admin',
+ 'django.contrib.comments',
Запустите Syndb, чтобы создать таблицы, необходимые для приложения комментариев:
./manage.py syncdb
Скопируйте новую страницу link_detail.html
из набора подарков:
cp /tmp/sr-goodies-master/templates/links/link_detail2.html \
~/proj/steelrumors/templates/links/link_detail.html
Нам нужно отображать количество комментариев на самой главной странице. Поэтому добавьте следующие строки в steelrumors/templates/links/link_list.html
в начале и середине шаблона:
{% extends "base.html" %}
+ {% load comments %}
...
{{ link.title }}
+ {% get_comment_count for link as comment_count %}
+ {{ comment_count }} comment{{ comment_count|pluralize }}
Добавьте эту строку в steelrumours/urls.py
для подключения приложения для комментариев:
url(r'^comments/', include('django.contrib.comments.urls')),
Теперь откройте любую страницу с подробными сведениями о ссылке и получайте удовольствие от написания комментариев!
Развлечение со случайными сплетнями
Добавьте класс миксина с именем RandomGossipMixin
в links/views.py
перед классом LinkListView
:
from django.contrib.comments.models import Comment
...
class RandomGossipMixin(object):
def get_context_data(self, **kwargs):
context super(RandomGossipMixin, self).get_context_data(**kwargs)
context[u"randomquip"] Comment.objects.order_by('?')[0]
return context
Измените объявление класса LinkListView
, чтобы включить этот миксин в качестве базового класса:
class LinkListView(RandomGossipMixin, ListView):
Добавьте следующие строки в steelrumors/templates/links/link_list.html
перед строкой endblock
:
{{ randomquip.comment|truncatechars:140 }}
Теперь обновите домашнюю страницу и наслаждайтесь случайным комментарием, появляющимся внизу страницы.
Заключительные комментарии
На данный момент у нас есть гораздо более полнофункциональный сайт социальных новостей. Пользователи могут отправлять ссылки и комментировать их. В следующей и заключительной части мы рассмотрим написание миксинов и алгоритмов ранжирования в Django. Благодаря этому пользователи смогут голосовать и влиять на рейтинг ссылок.
На этом завершается Часть 3. Следите за мной в Twitter по адресу @arocks , чтобы получать обновления о предстоящих частях.
РЕДАКТИРОВАТЬ : ознакомьтесь с частью 4!
Ресурсы
- Полный исходный код на Github
- Пакет вкусностей на Github