Django 개념

장고 팔로우, 팔로잉 기능 구현하기

MC류짱 2022. 10. 13. 17:22

커스텀 user앱 --> accounts

accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    followings = models.ManyToManyField('self', symmetrical=False, related_name='followers')
  • 커스텀 유저앱 models.py에 User로 커스텀한 클래스에 followings 필드 추가
  • 필드는 ManyToManyField, 첫 매개변수는 'self', symmetrical은 False (True로 하면 서로 맞팔이 자동으로 됨)
  • 명시적으로 사용하기 위해 related_name은 followers로 정해주기

 

accounts/urls.py

from django.urls import path
from . import views

app_name = 'accounts'
urlpatterns = [
    .....
    path('<int:user_pk>/follow/', views.follow, name='follow'),
]

 

accounts/views.py

@require_POST
def follow(request, user_pk):
    if request.user.is_authenticated:
        User = get_user_model()
        me = request.user
        you = User.objects.get(pk=user_pk)
        if me != you:
            if you.followers.filter(pk=me.pk).exists():
                you.followers.remove(me)
            else:
                you.followers.add(me)

        return redirect('accounts:profile', you.username)
    return redirect('accounts:login')
  • me는 현재 나의 유저 정보
  • you는 들어간 프로필 상대의 유저 정보
  • me != you == 내가 나를 팔로우하는 상황을 막아줌
  • 상대방의 팔로워목록에 내가 있다면 나를 삭제, 없다면 나를 추가

 

accounts/templates/accounts/profile.html

<h1>{{ person.username }}님의 프로필</h1>
  <p>팔로잉 : {{ person.followings.all|length }} / 팔로워 : {{ person.followers.all|length }}</p>
  {% if request.user != person %}
    <form action="{% url 'accounts:follow' person.pk %}" method='POST'>
      {% csrf_token %}
      {% if request.user in person.followers.all %}
        <input type="submit" value="언팔로우">
      {% else %}
        <input type="submit" value="팔로우">
      {% endif %}
    </form>
  {% endif %}

 

 

홈페이지