Автор оригинала: 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 %}
-
{{ link.title }}
{% 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!
Ресурсы
- Полный исходный код на Github (репозиторий изменился!)
Это стало очень спорным. Большинство людей лучше всего учатся, делая это сами. Но им нужно сначала прочитать/услышать/увидеть это от кого-то. На самом деле я программист-самоучка. Большую часть программирования я выучил по книгам и пробовал сам. Обучение на практике – это, безусловно, лучший способ учиться. Но среди источников знаний наблюдение за экспертом, вероятно, лучший. ↩︎