본문 바로가기
📝💪/Django

4주차_3번째_친구 리스트 만들기

by 수쨔앙 2022. 9. 25.

UserModel에 Follower 추가하기

 

1. 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.CharField(max_length=256, default='')
    follow = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='followee')

 

2. 장고에게 알려주기

python manage.py makemigrations
python manage.py migrate

 

3. 사용자 데이터 만들기

사용자 팔로잉을 해야 하기 때문에 만들어야 한다.

회원가입 페이지에서 대략 6~7명 정도 만들고 테스트해보자

 

http://127.0.0.1:8000/admin 로 들어가서 로그인하고 User models로 들어가면

잘 보인다!

 

wool로 들어가서 kang, son, ha를 follow 해줬다!

 

 


 

1. View 만들기

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 #me는 로그인한 사용자
    click_user = UserModel.objects.get(id=id) #click_user는 me가 팔로우하거나 팔로우 취소할 사용자
    if me in click_user.followee.all(): # followee안에 me가 있으면(팔로우 중이면)
        click_user.followee.remove(request.user) # 제거해주고
    else: # 팔로우 안하고 있으면
        click_user.followee.add(request.user) # 추가해주자
    return redirect('/user')

 

 

2. url 이어주기

user/urls.py 코드 추가하기

# user/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('sign-up/', views.sign_up_view, name='sign-up'),
    path('sign-in/', views.sign_in_view, name='sign-in'),
    path('logout/', views.logout, name='logout'),
    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 추가하기

<!-- 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 %}

 

 

4. user_list.html파일 url 연결해주기

templates/base.html 수정해주기

상단 네이게이션 바에 '친구'부분에 url이 없기때문에 연결해주자

'친구'부분의 <a> 태그 안에 href= 에 url 넣어주자

 

<!-- templates/base.html -->

...생략 

<div class="container">
  <a class="navbar-brand" href="/">SpartaSNS</a>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
          <li class="nav-item">
              <a class="nav-link" href="/user"> 친구 <span class="sr-only"></span></a>
          </li>
      </ul>
  </div>
  <form class="form-inline my-2 my-lg-0">
      {% if not user.is_authenticated %}
          <ul class="navbar-nav mr-auto">

.. 생략

 

 

 

 

 

 

 

잘 나온다! 신기하군 복습하자 복습

728x90

댓글