Рубрики
Без рубрики

Создание клона Hacker News в Django – Часть 3 (Комментарии и CRUD)

Автор оригинала: 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 в начале и середине шаблона:

    Добавьте эту строку в 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!

    Ресурсы