MU
Maciej Urmański2. November 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

4
Evgenii Legotckoi
  • 2. November 2019 16:05
  • (bearbeitet)

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. November 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. November 2019 04: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. November 2019 05:18
        • Die Antwort wurde als Lösung markiert.

        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
        

          Kommentare

          Nur autorisierte Benutzer können Kommentare posten.
          Bitte Anmelden oder Registrieren
          Letzte Kommentare
          ИМ
          Игорь Максимов5. Oktober 2024 07:51
          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas55. Juli 2024 11:02
          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssr8. Februar 2024 18:43
          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          EVA
          EVA25. Dezember 2023 10:30
          Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
          Jetzt im Forum diskutieren
          J
          JacobFib17. Oktober 2024 03:27
          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
          JW
          Jhon Wick1. Oktober 2024 15:52
          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
          КГ
          Кирилл Гусарев27. September 2024 09:09
          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
          F
          Fynjy22. Juli 2024 04:15
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

          Folgen Sie uns in sozialen Netzwerken