MU
Maciej UrmańskiNov. 2, 2019, 2:22 p.m.

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.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
4

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

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()

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
V
  • Viktor
  • April 14, 2021, 3:40 p.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
F
  • Fedya
  • April 14, 2021, 4:04 a.m.

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
KP

C++ - Тест 003. Условия и циклы

  • Result:71points,
  • Rating points1
Last comments
YA

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Hello. Let's say I want to send some variables to "run" define. How can we do that? I modified your code, I tried something like below, but the GUI is frozen that way. I could not be able to und…
R

Распознавание изображений на Python с помощью TensorFlow и Keras

почему то вместо 50000 обрабатывает по 782 картинки кажду. эпоху
R
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Понял сам так - происходит через setTable() "Sets the database table on which the model operates to tableName. Does not select data from the table, but fetches its field information", а затем че…
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Начал делать что-то похожее, но без sql. Не очень понимаю, что делает mapper->setCurrentModelIndex(model->index(row,0)); Вернее не понимаю вот что: откуда он берёт данные, кот…
Now discuss on the forum
VB

Помогите переложить код QML OpenCV c PyQt5 на PySide2

Структура проекта ├── main.py ├── main.qml └── PyCVQML ................├── cvcapture.py ................├── cvitem.py ................└── init .py …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.
d

Подключение приложения qt qml к БД postgresql из приложения qt qml c++, собранное под android

Алексей, код уже написан. Приложение работает под ОС Windows, но хочется его запустить на Android. По поводу сборки драйвера, не получается найти свежей инструкции, а главное рабочей.
d

Qt, Sqlite и Android. Как подключить базу данных?

Добрый день, добавил базу к ресурсам, приложение вроде как открывает БД, но данные не видет, что может быть не так? qt qml c++ под android m_db = QSqlDatabase::addDatabase("QSQLITE")…
  • BlinCT
  • April 13, 2021, 4:11 a.m.

Отображение талицы в Column в qml обьекте

Проблема в том что я все таблицы перевел на вторые контролы, все таблицы на них сделаны, шаблон для них всех создан. Только под 2 эти таблицы возвпащать все на первые контролы не думаю что прави…
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB