MU
Maciej Urmański2 ноября 2019 г. 15:22

Django follow unfollow

Django, django, python

Hi,

I try to solve my problem. I have follow and unfollow button on profile page, and on this page button works but I need to create this button on other pages. My problem is to filter when user is in target or not.

On profile page I have code:

{% if profile_user.followed %}
<a href="{% url 'unfollow' profile_user.id %}" class="btn btn-danger-gradiant btn-rounded letter-spacing-1" id="follow">Przestań obserwować</a>
{% else %}
<a href="{% url 'follow' profile_user.id %}" class="btn btn-danger-gradiant btn-rounded letter-spacing-1" id="follow">Obserwuj</a>
{% endif %}

In views this looks like that:

def profile(request, username):
    '''
    Shows the users profile
    '''
    enricher = Enrich(request.user)
    profile_user = get_object_or_404(User, username=username)
    feed = feed_manager.get_user_feed(profile_user.id)
    activities = feed.get(limit=25)['results']
    context = {}
    do_i_follow_users(request.user, [profile_user])
    context['profile_user'] = profile_user
    context['activities'] = enricher.enrich_activities(activities)
    response = render(request, 'auth/user_detail.html', context)
    return response

This filter come from function "do_i_follow_users" as you can see in views. But how to take user in other situation like this:

def goalcomments(request, slug):
    goal = get_object_or_404(Goal, slug=slug)

    comments = goal.goalcomment.filter(active=True)

    if request.method == 'POST':
        form = CommentGoal(data=request.POST)
        if form.is_valid():
            goal_comment = form.save(commit=False)
            goal_comment.author = request.user
            goal_comment.goal = goal
            goal_comment.save()
    else:
        form = CommentGoal()
    return render(request, 'goals/comments.html',
                {'goal': goal,
                'comments': comments,
                'form': form})

I don't know how to add this function "do_i_follow_users(request.user, [profile_user])" on view "commentgoal".
My Follow model is:

class Follow(Activity, models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='following_set')
    target = models.ForeignKey(User, on_delete=models.CASCADE, related_name='follower_set')
    created_at = models.DateTimeField(auto_now_add=True)
    deleted_at = models.DateTimeField(blank=True, null=True)

I must check if comment author is in target. Maybe someone help me.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 2 ноября 2019 г. 16:05
  • (ред.)

Hello,

Can you show source of do_i_follow_users function. I some misunderstand mechanism of this function. This function only check following relation, or create following relations ?

And I want suggest you to usi django-friendship battery. It is ready django-app for follow/unfollow relations, and for friendship relations.

    MU
    • 2 ноября 2019 г. 17:18

    Ok :)

    This is this function:

    def do_i_follow_users(user, users):
        followed_user_ids = Follow.objects.filter(user_id=user.id, target__in=users, deleted_at__isnull=True).values_list('target_id', flat=True)
        for u in users:
            u.followed = u.id in followed_user_ids
    
    
    def do_i_follow(user, follows):
        do_i_follow_users(user, [f.target for f in follows])
    

    I use django getstream.io to create feed etc. I send signal after user click follow or unfollow to getstream. My follow and unfollow views:

    @login_required
    def follow(request, id):
    
        user = get_object_or_404(User, id=id)
    
        follow, created = Follow.objects.get_or_create(user=request.user,target=user)
    
        return HttpResponse()
    
    @login_required
    def unfollow(request, id):
    
        user = get_object_or_404(User, id=id)
    
        follow, created = Follow.objects.get_or_create(user=request.user,target=user)
        follow.delete()
    
        return HttpResponse()
    
      Evgenii Legotckoi
      • 3 ноября 2019 г. 4:37

      If you want check, is request.user in following users, then I think you can use custom template filter tag.

      For example I have user_in filter

      @register.filter
      def user_in(objects, user):
          if user.is_authenticated:
              return objects.filter(user=user).exists()
          return False
      

      using

      {% if objects|user_in:request.user %}
      {% elif %}
      {% endif %}
      

      I think you can create something else like this

      @register.filter
      def user_in(objects, user):
          if user.is_authenticated:
              users = [o.author for o in objects]
              return Follow.objects.filter(user_id=user.id, target__in=users, deleted_at__isnull=True).exists()
          return False
      

      and use it

      {% if goal_comments|user_in:request.user %}
      {% elif %}
      {% endif %}
      
        MU
        • 3 ноября 2019 г. 5:18
        • Ответ был помечен как решение.

        Thank you! For me work that:

        {% if comment.author.follower_set.all|user_in:request.user %}
        <a href="{% url 'unfollow' comment.author.id %}" class="btn btn-danger-gradiant btn-rounded btn-sm letter-spacing-1" id="follow">Przestań obserwować</a>
        {% else %}
        <a href="{% url 'follow' comment.author.id %}" class="btn btn-danger-gradiant btn-rounded btn-sm letter-spacing-1" id="follow">Obserwuj</a>
        {% endif %}
        

        and this templatetag:

        @register.filter
        def user_in(objects, user):
            if user.is_authenticated:
                return objects.filter(user=user).exists()
            return False
        

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          AD

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:50баллов,
          • Очки рейтинга-4
          m
          • molni99
          • 26 октября 2024 г. 11:37

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:80баллов,
          • Очки рейтинга4
          m
          • molni99
          • 26 октября 2024 г. 11:29

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:20баллов,
          • Очки рейтинга-10
          Последние комментарии
          i
          innorwall15 ноября 2024 г. 8:26
          Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
          i
          innorwall15 ноября 2024 г. 6:03
          Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
          i
          innorwall14 ноября 2024 г. 22:42
          Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
          i
          innorwall14 ноября 2024 г. 20:09
          Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
          Сейчас обсуждают на форуме
          i
          innorwall14 ноября 2024 г. 14:39
          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
          i
          innorwall11 ноября 2024 г. 21:55
          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
          9
          9Anonim25 октября 2024 г. 19:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
          ИМ
          Игорь Максимов3 октября 2024 г. 14:05
          Реализация навигации по разделам Спасибо Евгений!

          Следите за нами в социальных сетях