Российский Новый Университет
Опубликован: 25.01.2016 | Доступ: свободный | Студентов: 2234 / 161 | Длительность: 16:40:00
Лекция 7:

Чтение и комментирование

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

Цель лекции: реализовать возможность чтения твитов других пользователей, используя специальную кнопку "Читать"; рассмотреть воз-можность прекратить чтение твитов выбранного пользователя; создать модель пользователя для чтения твитов пользователями; создание страницы входа и выхода из системы.

Ключевые термины: твит, django, python, модель, шаблон, пользователь, читатель, данные, html, class, url база, файл, счетчик, профиль.

Разрешить пользователям читать других пользователей.

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

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

Стратегия для внедрения этой особенности состоит в следующем:

  • Создать модель данных для хранения пользователя и его читателей. Эта модель так же будет хранить различные части информации, относящиеся к пользователю.
  • Дать каждому пользователю кнопку чтения для перехода к их заголовку. Мы также создадим представление, которое показывает счетчики, такие как число твитов пользователя, который их создал и число их читателей. Это потребует невероятного количества работы, но результаты будут этого достойны и мы научимся массе полезной информации в течении этого процесса.

Так давайте начнем.

Во-первых, мы добавим счетчик ретвитов для каждого твита и отслеживание всех твитов, которые отметил пользователь. Для реализации этого, мы используем модель данных UserModel.

Модель данных UserModel

Когда пользователь читает другого пользователя, нам нужно хранить следующую информацию в базу данных:

  • Данные о пользователе, которого начали читать. Нам нужно этого для того, чтобы определить пользователя, у которого больше всего читателей за выбранный период времени.
  • Число читателей у пользователя
  • Список пользователей, кто читает нашего пользователя

Это нужно, чтобы предотвратить двойное добавление для чтения на одного и того же пользователя.

Для этой цели, Мы создадим новую модель данных, назовем ее UserFollowers. Откроем файл user_profile/model.py и добавим в него следующий класс:

class UserFollower(models.Model):
    user = models.ForeignKey(User, unique=True)
    date = models.DateTimeField(auto_now_add=True)
    count = models.IntegerField(default=1)
followers= models.ManyToManyField(User,related_name='followers')
    def __unicode__(self):
        return self.user.username

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

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

Поле date имеет тип models.DateTimeField. Как можно догадаться по имени поля, оно нужно для хранения значения даты/времени. Аргумент auto_now_add указывает Django на то, чтобы автоматически устанавливалась текущая дата/время в это поле, когда объект этих данных будет создан в первый раз.

Поле count имеет тип models.IntegerField. Это поле хранит целочисленное значение. Используя параметр default=1, мы указываем Django на то, чтобы установить 1 в это поле, когда объект этих данных будет создан в первый раз.

Параметр followers типа models.ManyToManyField содержит список пользователей, которых читает данный пользователь.

Здесь параметр related_name=`followers` должен быть вторым парметром. И пользователь и читатель относятся к классу user, которые, если обратиться к по относительному имени, выдаст ошибку, такую как получающий доступ к полю user сталкивается с относительным m2m полем User.userfollowers_set.

После введения кода модели данных в файл user_profile/model.py, выполните следующую команду, чтобы создать его корреспондирующие таблицы в базе данных:

python manage.py syncdb

С этой командой мы сможем сохранить всю информацию, которая нам нужна для поддержки читателей.

Далее, мы создадим представление, в котором пользователи читают других пользователей, нажимая кнопку "Читать" по имени профиля.

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

Давайте отредактируем текущий профиль пользователя, profile.html

Добавим напротив имени пользователя иконку пользователя, Мы можем использовать глиф-иконки Bootstrap. Это набор иконок, поставляемых по умолчанию с Bootstrap.

<p class="navbar-text navbar-right">
        <span class="glyphicon glyphicon-user"></span> 
{{ user.username }}
    </p>
{% endblock %}

Мы также сделаем дизайн нового текстового поля публикации твита на странице профиля. Обновленный файл profile.html будет выглядеть так:

{% extends "base.html" %}
{% block navbar %}
     <p class="navbar-text navbar-left">
        <span class="glyphicon glyphicon-user"> 
</span>  {{ profile.username } </p>

{% endblock %}
{% block content %}

    <div class="row clearfix">

        <div class="col-md-6 col-md-offset-3 column">
            <form id="search-form" action="post/" method="POST">{% csrf_token %}
                <div class="input-group">
                    {{ form.text.errors }}
                    {{ form.text }}
                    {{ form.country.as_hidden }}

      <span class="input-group-btn">
        <button class="btn btn-default" type="submit">Post</button>
      </span>
                </div>
                <!-- /input-group -->
            </form>
        </div>
        <h1> </h1>
        <div class="col-md-12 column">
            {% for tweet in tweets %}
                <div class="well">
                    <span>{{ tweet.text }}</span>
                </div>
            {% endfor %}
        </div>
    </div>
{% endblock %}

Обновите файл forms.py для отрисовки новой формы:

class TweetForm(forms.Form):
    text = forms.CharField(widget=forms.Textarea(attrs={'rows': 1, 'cols': 85, 'class':'form-control post-tweet', 'placeholder': 'Опубликовать новый твит'}), max_length=160)
    country = forms.CharField(widget=forms.HiddenInput())

Обновленный элемент интерфейса будет выглядеть примерно так:


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

Еще одна важная вещь, которую мы не можем оставить без внимания - это логин пользователя и регистрация. Будущие функции не могут использоваться без этого. Мы осуществим сначала функцию входа, а затем мы будем двигаться к функциональности чтения.

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Константин Боталов
Константин Боталов

Вроде легкие вопросы и ответы знаю правильные, но система считает иначе и правильные ответысчитает неправильными. Приходится выполнть по несколько раз. Это я не правильно делаю или тест так составлен?

Владимир Филипенко
Владимир Филипенко

Листинг показывает в 4-ой лекции, что установлен Django 1.8.4. Тут же далее в этой лекции указаны настройки, которые воспринимает Django 1.7 и младше.