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

Создание клона Hacker News в Django – Часть 2 (Профили пользователей и регистрации)

Автор оригинала: 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!

Ресурсы