커스텀 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 %}
홈페이지
'Django 개념' 카테고리의 다른 글
장고 rest api 게시판 게시글, 댓글 만들기 (DRF, json) (0) | 2022.10.17 |
---|---|
장고 해시태그 기능 구현하기 #해시태그 (0) | 2022.10.13 |
장고 좋아요 기능 구현하기 (0) | 2022.10.13 |
장고 커스텀 filter 만들기 (0) | 2022.10.13 |
Django DB 저장, 조회, 수정, 삭제 crud (장고) (0) | 2022.09.01 |