Автор оригинала: Arun Ravindran.
Вы читаете пост из серии руководств, состоящей из четырех частей.
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Прошло больше недели с момента публикации первой части этой серии руководств, и я получил положительные отзывы от нескольких каналов. По иронии судьбы, он был чрезвычайно популярен в Hacker News . Его даже перевели на китайский язык .
Безусловно, цель не заключалась в создании полнофункционального клона какого-либо веб-сайта. Настоящая цель – изучить Django с помощью проекта среднего размера, который использует его в полной мере. Во многих руководствах не удается собрать воедино различные части Django. По сравнению с микрофреймворком вроде Flask (что тоже здорово, кстати), Django поставляется с большим количеством включенных батарей. Если у вас мало времени, это делает его идеальным для завершения такого амбициозного проекта.
Это руководство покажет вам, как реализовать социальные функции, такие как поддержка страниц регистрации пользователей и профилей. Мы будем использовать представления на основе классов Django для создания CRUD . На этот раз предстоит пройти еще много работы.
Как и раньше, есть текстовое описание шагов, если вы не предпочитаете смотреть видео целиком. Существует также набор подарков с шаблонами и другими материалами, которые могут потребоваться, если вы следуя этому руководству.
Это видео будет продолжением предыдущего, и я рекомендую его посмотреть. Нажмите на изображение ниже, чтобы посмотреть скринкаст, или прокрутите вниз, чтобы прочитать шаги.
Понравился этот урок? Тогда вам следует подписаться на мою готовящуюся к выпуску книгу «Создание сайта социальных новостей на Django» . Он пытается объяснить в стиле учиться у друга , как создаются веб-сайты, и постепенно затрагивает сложные темы, такие как тестирование, безопасность, миграция баз данных и отладка.
Пошаговая инструкция
Вот текстовая версия видео для людей, предпочитающих читать. В части 1 мы показали вам, как создать частный сайт, похожий на бета-версию, для публикации слухов о “Человеке из стали” .
План части 2 скринкаста таков:
- Лучший брендинг и шаблоны
- Пользовательский вход/выход
- Социопат в на самом деле соцсети – django-registrations
- Простая регистрация
- Профили пользователей
Откройте упаковку вкусностей
Пока что внешний вид сайта выглядит несколько блеклым. Давайте воспользуемся некоторыми активами, которые заранее разработаны для этого урока.
Загрузите 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
Скопируйте весь каталог static
из извлеченных файлов в steelrumors/steelrumors
. Кроме того, перезапишите извлеченный шаблон sr-goodies-master/templates/base.html
в steelrumors/steelrumors/templates/
cp -R /tmp/sr-goodies-master/static ~/proj/steelrumors/steelrumors/
cp /tmp/sr-goodies-master/templates/base.html ~/proj/steelrumors/steelrumors/templates/
Пользовательская страница входа
Добавьте в steelrumors/urls.py
:
url(r'^login/$', 'django.contrib.auth.views.login', {
'template_name': 'login.html'}, name"login"),
url(r'^logout/$', 'django.contrib.auth.views.logout_then_login',
name"logout"),
Добавьте URL-адреса входа/выхода в steelrumors/settings.py
:
from django.core.urlresolvers import reverse_lazy
LOGIN_URLreverse_lazy('login')
LOGIN_REDIRECT_URL reverse_lazy('home')
LOGOUT_URLreverse_lazy('logout')
Теперь скопируйте login.html
из пакета подарков в каталог templates
:
cp /tmp/sr-goodies-master/templates/login.html ~/proj/steelrumors/steelrumors/templates/
Обновите браузер, чтобы просмотреть страницы с новым стилем.
Использование django-регистраций
Мы будем использовать “простой” бэкэнд django-registrations , поскольку он прост в использовании и понимании.
В настоящее время версия регистрации django в индексе пакетов Python не работает с Django 1.5. Итак, мы будем использовать мою разветвленную версию с помощью pip:
pip install git+git://github.com/arocks/django-registration-1.5.git
Или, если у вас не установлен git, используйте:
pip install https://github.com/arocks/django-registration-1.5/tarball/master
Измените settings.py
, чтобы добавить приложение регистрации в конец INSTALLED_APPS .
'registration',
)
Запустите syncdb, чтобы создать модели регистрации:
./manage.py syncdb
Нам нужно использовать шаблон формы регистрации из набора вкусностей. Поскольку это приложение для регистрации, нам нужно создать каталог registration
в templates
:
mkdir ~/proj/steelrumors/steelrumors/templates/registration/
cp /tmp/sr-goodies-master/templates/registration/registration_form.html
~/proj/steelrumors/steelrumors/templates/registration/
Добавить в urls.py
:
url(r'^accounts/', include('registration.backends.simple.urls')),
Посетите http://127.0.0.1:8000/accounts/register/ и создайте нового пользователя. Это вызовет ошибку «Страница не найдена» после создания пользователя.
Создать страницу профиля пользователя
Добавьте класс UserProfile
и его сигналы в models.py
:
class UserProfile(models.Model):
user models.OneToOneField(User, uniqueTrue)
bio models.TextField(nullTrue)
def __unicode__(self):
return "%s's profile" % self.user
def create_profile(sender, instance, created, **kwargs):
if created:
profile, created UserProfile.objects.get_or_create(userinstance)
# Signal while saving user
from django.db.models.signals import post_save
post_save.connect(create_profile, senderUser)
Снова запустите syncdb, чтобы создать модель профиля пользователя:
./manage.py syncdb
Добавьте их в admin.py
приложения ссылок, чтобы заменить/расширить администратора по умолчанию для пользователя:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import get_user_model
...
class UserProfileInline(admin.StackedInline):
model UserProfile
can_delete False
class UserProfileAdmin(UserAdmin):
inlines(UserProfileInline, )
admin.site.unregister(get_user_model())
admin.site.register(get_user_model(), UserProfileAdmin)
Посетите http://127.0.0.1:8000/admin/ и откройте сведения о любом пользователе. Внизу должно появиться поле биографии.
Добавить в views.py
приложений для ссылок:
from django.views.generic import ListView, DetailView
from django.contrib.auth import get_user_model
from .models import UserProfile
....
class UserProfileDetailView(DetailView):
model get_user_model()
slug_field "username"
template_name "user_detail.html"
def get_object(self, querysetNone):
user super(UserProfileDetailView, self).get_object(queryset)
UserProfile.objects.get_or_create(useruser)
return user
Скопируйте user_detail.html
из goodies в steelrumors/templates/
:
cp /tmp/sr-goodies-master/templates/user_detail.html \
~/proj/steelrumors/steelrumors/templates/
Давайте добавим URL-адреса, которые не удались в последний раз, когда мы пытались создать пользователя. Добавить в urls.py
:
from links.views import UserProfileDetailView
...
url(r'^users/(?P\w+)/$', UserProfileDetailView.as_view(), name"profile"),
Теперь попробуйте создать пользователя, и он должен работать. Вы также должны увидеть страницу профиля для вновь созданного пользователя, а также других пользователей.
Вероятно, вы не захотите каждый раз вводить эти ссылки вручную. Итак, давайте отредактируем base.html
, добавив строки со знаком плюс ‘+’ (без знака плюс) ниже:
{% if user.is_authenticated %}
Logout |
+ {{ user.username }}
{% else %}
+ Register |
Обновите браузер, чтобы увидеть изменения.
Отредактируйте данные вашего профиля
Добавьте класс UserProfileEditView
в views.py
в приложении ссылок:
from django.views.generic.edit import UpdateView
from .models import UserProfile
from .forms import UserProfileForm
from django.core.urlresolvers import reverse
class UserProfileEditView(UpdateView):
model UserProfile
form_class UserProfileForm
template_name "edit_profile.html"
def get_object(self, querysetNone):
return UserProfile.objects.get_or_create(userself.request.user)[0]
def get_success_url(self):
return reverse("profile", kwargs{'slug': self.request.user})
Создайте links/forms.py
:
from django import forms
from .models import UserProfile
class UserProfileForm(forms.ModelForm):
class Meta:
model UserProfile
exclude ("user")
Добавьте представление редактирования профиля в urls.py
. Защитите его с помощью декоратора auth
, чтобы незарегистрированные пользователи не видели это представление.
from django.contrib.auth.decorators import login_required as auth
from links.views import UserProfileEditView
...
url(r'^edit_profile/$', auth(UserProfileEditView.as_view()), name"edit_profile"),
Скопируйте edit_profile.html
из goodies в steelrumors/templates/
:
cp /tmp/sr-goodies-master/templates/edit_profile.html \
~/proj/steelrumors/steelrumors
Добавьте следующие строки в templates/user_detail
перед последним endblock
:
{% if object.username user.username %}
Edit my profile
{% endif %}
Теперь посетите страницу своего профиля и попробуйте отредактировать его.
Пасхальное яйцо весело
Добавьте следующие строки в user_detail.html
перед строкой endblock
:
{% if "zodcat" in object.userprofile.bio %}
{% endif %}
Теперь упомяните «zodcat» в своей биографии. У тебя есть пасхальное яйцо!
Заключительные комментарии
В конце этого урока у нас есть гораздо более привлекательный сайт. Хотя любой желающий может зарегистрироваться на сайте, он не будет частью персонала. Следовательно, вы не можете отправлять ссылки через интерфейс администратора. Это будет рассмотрено в следующей части.
На этом завершается Часть 2. Следите за мной в Twitter по адресу @arocks , чтобы получать обновления о предстоящих частях.
РЕДАКТИРОВАТЬ : ознакомьтесь с частью 3!
Ресурсы
- Полный исходный код на Github
- Пакет вкусностей на Github