Django создал_at__gt = self.request.user.last_login только для пользователей, которые уже вошли в систему. - PullRequest
0 голосов
/ 16 декабря 2018

Вступление: У меня есть 3 модели user, post, group.Пользователь может создавать сообщения, однако каждое сообщение должно принадлежать группе.Пользователи должны выбирать из существующих групп для своих сообщений.Пользователи не могут добавлять, удалять, обновлять группы.

Более того:

Пользователи могут становиться членами групп и при нажатии на определенную группу.Они видят все сообщения в этой группе.

Что я хочу Когда пользователи заходят на домашнюю страницу, они видят записи, которые были добавлены с момента последнего входа в систему

enter image description here

Мои модели

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts')
    group = models.ForeignKey(Group, related_name='posts')
    title = models.CharField(max_length=250, unique=True)
    message = models.TextField()
    created_at = models.DateTimeField(auto_now=True)

Мои просмотры

class Homepage(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Homepage, self).get_context_data(**kwargs)  
        if self.request.user.is_authenticated():
            context['object_list'] = Group.objects.filter(members=self.request.user)

            #What am I doing wrong in the below code
            new_posts = Post.objects.filter(created_at__gt=self.request.user.last_login).count()
            context['new_posts'] = new_posts
         else:
              context['object_list'] = Group.objects.all()
        return context

В моих шаблонах у меня есть

<div class="list-group">
   {% for group in object_list %}        
       {% if not new_posts %}
               {{group.post.count}}
        {% else %}
                {{new_posts}}
        {% endif %}
    {% endfor %}
</div>

Проблема: Только пользователи, которые уже вошли в систему и обновили свою страницу, видят новые сообщения пример: 4 new, 3new и т. Д. ,Если пользователь регистрируется заново после создания новых сообщений в группе.Он не видит 4 new, 3new.Вместо этого он показывает ему только количество постов в группе.не новые сообщения, так как он вошел в систему. Почему это происходит?

1 Ответ

0 голосов
/ 16 декабря 2018

Ну, это нормальное поведение, потому что last_login хранит дату и время, когда пользователь последний раз входил в систему. Когда пользователь заново входит в систему, он сохраняет текущее время (timezone.now).Таким образом, если сообщение создано до того, как он вошел в систему, оно не появится в new_posts.Поэтому, если вы хотите сохранить предыдущее время входа / выхода, вам нужно сохранить его где-то еще (или создать новое поле модели).Вы можете попробовать вот так, используя сигнал пользователя, вышедшего из системы :

from django.contrib.auth.signals import user_logged_out


def do_stuff(sender, user, request, **kwargs):
    user.logout_time = timezone.now()
    user.save()

user_logged_out.connect(do_stuff)  # Hook an a method to user_logged_out signal to update logout time

И использовать его в представлении следующим образом:

last_post = Post.objects.last()
if last_post.created_at < request.user.last_login:
   new_posts = Post.objects.filter(created_at__gt=self.request.user.logout_time).count()
   context['new_posts'] = new_posts

Обновление

В этом примере необходимо иметь поле для хранения времени выхода из системы.Если у вас есть CustomUser , вы можете напрямую создать его в модели CustomUser.Иначе, вы можете добавить его следующим образом:

class Profile(models.Model):
    user = models.OneToOneField(User)
    logout_time = models.DateTimeField(default=timezone.now)

и сохранить время выхода из системы следующим образом:

user.profile.logout_time = timezone.now()

и отфильтровать новые сообщения следующим образом:

new_posts = Post.objects.filter(created_at__gt=self.request.user.profile.logout_time)
...