1. user/models.py의 UserModel class 안에 follow 선언
# 우리의 모델을 우리가 ManyToMany Field로 참조하겠다.
follow = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='followee')
2.
$ python manage.py makemigrations
$ python manage.py migrate
- DB에 my_user_follow 테이블이 생성됨
3. user/views.py에서 user_view, user_follow 메서드 작성
@login_required
def user_view(request):
if request.method == 'GET':
# 사용자 불러오기, exclude로 로그인 한 사용자 제외
user_list = UserModel.objects.all().exclude(username=request.user.username)
return render(request, 'user/user_list.html', {'user_list': user_list})
@login_required
def user_follow(request, id):
me = request.user
target_user = UserModel.objects.get(id=id)
# target_user를 follow 하는 모든 user을 불러와서 me가 있는지 검사
if me in target_user.followee.all():
# 이미 follow가 되어 있다면 팔로우 취소
target_user.followee.remove(request.user)
else:
# follow가 되어 있지 않다면 팔로우
target_user.followee.add(request.user)
return redirect('/user')
4. user/urls.py에서 user_view, user_follow path 추가
path('user/', views.user_view, name='user-list'),
path('user/follow/<int:id>/', views.user_follow, name='user-follow'),
5. templates/user/user_list.html 작성
<!-- templates/user/user_list.html -->
{% extends 'base.html' %}
{% block title %}
사용자 리스트
{% endblock %}
{% block content %}
<div class="container timeline-container">
<div class="row">
<!-- 왼쪽 컬럼 -->
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ user.username }}</h5>
<p class="card-text"> {{ user.bio }}</p>
</div>
</div>
</div>
<!-- 오른 쪽 컬럼-->
<div class="col-md-7">
<div class="row">
<div class="alert alert-success" role="alert">
나를 팔로우 하는 사람 수 : {{ user.followee.count }} 명 / 내가 팔로우 하는 사람 수 : {{ user.follow.count }} 명
</div>
</div>
<div class="row">
<!-- 사용자 리스트 반복문 -->
{% for ul in user_list %}
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ ul.username }}</h5>
<h6 class="card-subtitle mb-2 text-muted">{{ ul.email }}</h6>
<p class="card-text">
{{ ul.bio }}
</p>
<p class="card-text">
팔로잉 {{ ul.follow.count }} 명 / 팔로워 {{ ul.followee.count }} 명
</p>
{% if ul in user.follow.all %}
<a href="/user/follow/{{ ul.id }}" class="card-link">[팔로우 취소]</a>
{% else %}
<a href="/user/follow/{{ ul.id }}" class="card-link">[팔로우]</a>
{% endif %}
</div>
</div>
<hr>
{% endfor %}
</div>
</div>
<div class="col-md-2"></div>
</div>
</div>
{% endblock %}
'Backend > Django' 카테고리의 다른 글
[파이썬] Django - SNS 기초 실습 7) tag (django-taggit) (0) | 2022.05.30 |
---|---|
[파이썬] Django - SNS 기초 실습 6) 회원가입/로그인/친구 서비스 디테일 (0) | 2022.05.30 |
[파이썬] Django - SNS 기초 실습 4) Tweet (조회, 댓글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 3) Tweet (게시글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 2) Tweet (홈 화면) (0) | 2022.05.27 |