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

Создание клона Hacker News в Django – Часть 1

Автор оригинала: Arun Ravindran.

Вы читаете пост из серии руководств, состоящей из четырех частей.

  • Часть 1
  • Часть 2
  • Часть 3
  • Часть 4

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

В этой серии видеоуроков я расскажу вам о создании сайта социальных новостей «Steel Rumors» с нуля в Django 1.5. Если вам не нравятся видео и вы предпочитаете читать инструкции, вы также можете найти их здесь.

Несмотря на то, что мы начнем с основ, если вы абсолютный новичок в Django, я бы посоветовал прочитать руководство или мой предыдущий скринкаст о создании блога за 30 минут

Завершенный сайт будет поддерживать регистрацию пользователей, отправку ссылок, комментарии, голосование и крутой алгоритм ранжирования. Мой подход состоял бы в том, чтобы использовать как можно больше встроенных функций Django и использовать внешние приложения только в случае крайней необходимости.

Посмотрите сами демонстрацию Steel Rumors .

Нажмите на изображение ниже, чтобы посмотреть скринкаст, или прокрутите вниз, чтобы прочитать шаги.

Если вам понравился этот урок, подпишитесь на мою готовящуюся к выпуску книгу «Создание сайта социальных новостей на Django» . Он пытается объяснить в стиле учиться у друга , как создаются веб-сайты, и постепенно затрагивает сложные темы, такие как миграция баз данных и отладка.

Пошаговая инструкция

Вот текстовая версия видео для людей, предпочитающих читать. Мы собираемся создать сайт социальных новостей, аналогичный Hacker News или Reddit . Он будет называться «Стальные слухи» и станет местом, где можно будет поделиться и проголосовать за некоторые интересные слухи о «Человеке из стали» .

Краткое содержание первой части скринкаста:

  • Цель
  • VirtualEnv – Начните с нуля!
  • Модельные менеджеры – Работа мечты № 78
  • Базовый шаблон
  • Общие представления – ListView и DetailView
  • Пагинация – бесплатно!

Настроить виртуальную среду

Мы создадим виртуальную среду разработки, используя virtualenv и virtualenvwrapper . Убедитесь, что вы их сначала установили:

    mkvirtualenv djangorocks

В своем скринкасте я использую вариант Ubuntu под названием Xubuntu. Но вы должны иметь возможность воспроизвести эти шаги в других ОС с минимальными изменениями.

Установите Django (убедитесь, что у вас уже установлен pip )

    pip install Django1.5

Вы также можете использовать Django 1.5.1. Последняя версия Django может работать или не работать с нашим кодом, поэтому лучше указать версию, чтобы следовать этому руководству.

Создать проект и приложения

Создайте проект под названием steelrumors :

    cd ~/proj
    django-admin.py startproject steelrumors
    cd steelrumors
    chmod +x manage.py

Откройте steelrumors/settings.py в своем любимом редакторе. Найдите и измените следующие строки (изменения выделены жирным шрифтом):

1. 'ENGINE': 'django.db.backends.__sqlite3__'
2. 'NAME': '__database.db__',
3. At the end of INSTALLED_APPS = (     __'django.contrib.admin',__

Затем измените steelrumors/urls.py , раскомментировав следующие строки:

    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    admin.autodiscover()

    urlpatterns  patterns('',
        url(r'^admin/', include(admin.site.urls)),
    )

Синхронизируйте, чтобы создать административные объекты и ввести данные администратора:

    ./manage.py syncdb

Откройте новую вкладку или новый терминал и продолжайте работу экземпляра сервера (не забудьте ввести workon djangorocks в этом терминале):

    ./manage.py runserver

Посетите страницу администратора (обычно по адресу http://127.0.0.1:8000/admin/) и войдите в систему.

Создайте приложение links :

    ./manage.py startapp links

Введите следующие два класса модели в links/models.py :

    from django.db import models
    from django.contrib.auth.models import User

    class Link(models.Model):
        title  models.CharField("Headline", max_length100)
        submitter  models.ForeignKey(User)
        submitted_on  models.DateTimeField(auto_now_addTrue)
        rank_score  models.FloatField(default0.0)
        url  models.URLField("URL", max_length250, blankTrue)
        description  models.TextField(blankTrue)

        def __unicode__(self):
            return self.title

    class Vote(models.Model):
        voter  models.ForeignKey(User)
        link  models.ForeignKey(Link)

        def __unicode__(self):
            return "%s upvoted %s" % (self.voter.username, self.link.title)

Создайте соответствующие классы администратора. Введите в links/admin.py следующее:

    from django.contrib import admin
    from .models import Link, Vote

    class LinkAdmin(admin.ModelAdmin): pass
    admin.site.register(Link, LinkAdmin)

    class VoteAdmin(admin.ModelAdmin): pass
    admin.site.register(Vote, VoteAdmin)

Введите в links/views.py следующее:

    from django.views.generic import ListView
    from .models import Link, Vote

    class LinkListView(ListView):
        model  Link

Вставьте следующие строки в steelrumor/urls.py :

    from links.views import LinkListView
    ...
    urlpatterns  patterns('',
        url(r'^$', LinkListView.as_view(), name'home'),

Создайте новый каталог шаблонов и введите следующее в steelrumors/templates/links/link_list.html :

    
    {% for link in object_list %}
  1. {{ link.title }}
  2. {% endfor %}

Отредактируйте settings.py , чтобы добавить два наших приложения в конец INSTALLED_APPS = (

    'links',
    'steelrumors',
    )

Синхронизация для создания объектов ссылок:

    ./manage.py syncdb

Visit http://127.0.0.1:8000/admin/ and add a couple of Link objects. Now if you open http://127.0.0.1:8000/ you should see the added Links

Добавить брендинг

Создайте общий базовый шаблон в steelrumors/templates/base.html :

    
    
    

Steel Rumors

{% block content %} {% endblock %}

Измените steelrumors/templates/links/link_list.html и заключите предыдущий код следующим образом:

    {% extends "base.html" %}

    {% block content %}
    ...
    {% endblock %}

VoteCount Менеджер модели

Нам нужен подсчет голосов в нашем общем ListView . Добавьте их в links/models.py :

    from django.db.models import Count

    class LinkVoteCountManager(models.Manager):
        def get_query_set(self):
            return super(LinkVoteCountManager, self).get_query_set().annotate(
                votesCount('vote')).order_by('-votes')

Вставьте эти две строки в класс Link в links/models.py :

    class Link(models.Model):
    ...

        with_votes  LinkVoteCountManager()
        objects  models.Manager() #default manager

Отредактируйте links/views.py и вставьте эти две строки в класс LinkListView :

    class LinkListView(ListView):
    ...

        queryset  Link.with_votes.all()
        paginate_by  3

Безумное развлечение

Вы можете добавить 100 голосов к случайным заголовкам, используя следующие строки в оболочке django:

$ ./manage.py shell
>>> from links.models import Link, Vote
>>> from django.contrib.auth.models import User
>>> a = User.objects.all()[0]
>>> for i in xrange(100):

Теперь посетите http://127.0.0.1:8000/admin/, чтобы найти множество объектов Votes.

Заключительные комментарии

Если вам интересно, будет ли вам полезна эта версия сайта, я бы сказал, что она хорошо работает для частной бета-версии. Любого нового пользователя придется добавлять вручную через интерфейс администратора. Они должны быть сотрудниками, если им нужно войти в систему через интерфейс администратора. Персонал может голосовать, вручную создавая объекты голосования.

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

На этом завершается Часть 1. Следуйте за мной в Twitter по адресу @arocks , чтобы получать обновления по следующим частям.

РЕДАКТИРОВАТЬ : ознакомьтесь с частью 2!

Ресурсы

Это стало очень спорным. Большинство людей лучше всего учатся, делая это сами. Но им нужно сначала прочитать/услышать/увидеть это от кого-то. На самом деле я программист-самоучка. Большую часть программирования я выучил по книгам и пробовал сам. Обучение на практике – это, безусловно, лучший способ учиться. Но среди источников знаний наблюдение за экспертом, вероятно, лучший. ↩︎