many-to-many 모델 만들기
1. UserModel에 Follower 추가하기
- user앱의 models.py
# user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
# Create your models here.
class UserModel(AbstractUser):
class Meta:
db_table = "my_user"
bio = models.TextField(max_length=500, blank=True)
follow = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='followee')
- settings 파일의 AUTH_USER_MODEL과 many-to-many
- related_name = 'followee' 가 AUTH_USER_MODEL 을 지칭하게 되는 것 같다.
2. 모델 추가했으므로 migrations 명령
many-to-many 모델 사용하기
1. view 만들기 (user앱의 views.py)
# user/views.py
@login_required
def user_view(request):
if request.method == 'GET':
# 사용자를 불러오기, exclude와 request.user.username 를 사용해서 '로그인 한 사용자'를 제외하기
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
click_user = UserModel.objects.get(id=id)
if me in click_user.followee.all():
click_user.followee.remove(request.user)
else:
click_user.followee.add(request.user)
return redirect('/user')
- user_view 함수
→ 사용자 리스트를 불러온다.
→ 단, `request.user.username` 으로 `exclude 기능을 사용`해서 로그인 한 사용자를 제외 한 유저들을 불러온다.
- user_follow 함수
→ 유저를 두가지로 나눈다. ( 로그인 한 사용자, 팔로우/팔로우취소를 누른 사용자)
→ user.follow.all()는 해당 사용자가 팔로우 하는 사람들을 불러온다.
→ user.followee.all()는 해당 사용자를 팔로우 하는 사람들을 불러온다.
→ user_follow 함수가 완료 된 후에는 http://127.0.0.1:8000/user url로 redirect시킨다.
2. url 연결하기 (user앱의 urls.py)
path('user/', views.user_view, name='user-list'), # <- 여기에 컴마 주의!
path('user/follow/<int:id>/', views.user_follow, name='user-follow')
3. html ( templates/user/user_list.html)
{% extends 'base.html' %} <!-- base.html 확장 -->
<!-- 로그인된 사용자 : user -->
<h5 class="card-title">{{ user.username }}</h5>
<p class="card-text"> {{ user.bio }}</p>
...
<div class="alert alert-success" role="alert">
나를 팔로우 하는 사람 수 : {{ user.followee.count }} 명
내가 팔로우 하는 사람 수 : {{ user.follow.count }} 명
</div>
...
<!-- 사용자 리스트 반복문 -->
{% 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 %}
'AI 웹 개발 과정 > 파이썬 장고 실무 기초' 카테고리의 다른 글
09. 5주차 이론 - django taggit module (0) | 2022.06.03 |
---|---|
07. 4주차 이론 - (0) | 2022.05.31 |
06. 3주차 실습 및 숙제 - 게시글 쓰기, 읽기, 삭제 / 댓글 추가 (0) | 2022.05.30 |
05. 3주차 이론 - (0) | 2022.05.30 |
04. 2주차 실습 및 숙제 - (1) | 2022.05.27 |