Django Basic 4
Static
settings.py
- 경로 설정
static
: 정적 파일 경로 설정media
: 미디어 파일 세팅- 개발 환경에서만 테스트를 위해 작동할 경로
- 실제 배포환경에서는 별도의 공간 구축
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = "static/"
STATICFILES_DIRS = [BASE_DIR / "static"] # 경로 참조
STATIC_ROOT = BASE_DIR / "staticfiles" # 배포시 사용
# 미디어 세팅
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
이미지 기능 추가
모델 수정
- 이미지의 경로가 들어갈 테이블 추가
blank
: 공백 허용 설정
- 수정 후에는 migration 실시 해 적용
class Article(models.Model):
title = models.CharField(max_length=50)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
#
image = models.ImageField(upload_to='images/', blank=True) # 비어있어도 된다
def __str__(self):
return self.title
정적파일 경로
<app이름>/static/<app이름>
구조로 생성<app이름>/<파일명>
으로 접근
템플릿 반영
- Django Template Tag 사용
load static
: 템플릿 상단에서 선언static
태그 사용 : 설정한 경로로 접근
article.image
와article.image.url
로 접근 가능
커스텀 User 모델
- 프로젝트 생성 시 설정 권장
- 중간에 수정하는 경우 DB 초기화 필요
- SQLite 파일, 생성된
migrations
파일 삭제
settings.py
- 사용자의
User
모델 지정AUTH_USER_MODEL = "accounts.User"
model = get_user_model()
로 작성된 곳에 자동 적용
models.py
accounts
에서 설정class User(AbstractUser): : pass
- 커스텀 모델로 설정 후 프로젝트를 진행하면서 기능 추가
작성자 기능
models.py
- 작성자 테이블 추가
"accounts.User"
: 사용자의 User 모델 활용CASCADE
: 사용자 정보가 삭제되면 같이 삭제article.author
로 데이터에 접근 가능
class Article(models.Model):
...
author = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="articles")
...
좋아요 기능
urls.py
- 작성글에 귀속되도록 설정
from django.contrib import admin
from django.urls import path
from . import views
app_name = "articles"
# 'articles:`
urlpatterns = [
...
path("<int:pk>/like/" , views.like, name='like'),
...
models.py
- 좋아요 테이블 추가
ManyToManyField
: 다 대 다, N : M 관계- 사용자는 여러 글에 좋아요 가능/ 게시글은 여러 사용자에게 좋아요를 받을 수 있음
- Django 중계 테이블을 생성하여 기능 제공
class Article(models.Model):
...
like_user = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name="like_articles",
)
...
views.py
@require_POST
: 데이터 테이블 사용하기 떄문에POST
요철if request.user.is_authenticated:
: 로그인 후 사용if article.like_user.filter(pk=request.user.pk).exists():
- 이미 좋아요가 있다면 제거
@require_POST
def like(request, pk):
if request.user.is_authenticated:
article = get_object_or_404(Article, pk=pk)
if article.like_user.filter(pk=request.user.pk).exists():
article.like_user.remove(request.user)
else:
article.like_user.add(request.user)
return redirect("articles:articles")
else:
return redirect("accounts:login")
템플릿 설정
if request.user in article.like_user.all
: 좋아요를 누른 명단에 있는지 확인- 결과에 따라 다른 버튼 표시
팔로우 기능
models.py
accounts
: 계정과 연동되는 기능- 커스텀 User 모델에 기능 추가
self
: 자기 자신을 참조하여 작동symmetrical
: 대칭 기능
class User(AbstractUser):
following = models.ManyToManyField(
"self", related_name='followers', symmetrical=False
)
urls.py
users.py
: 사용자 페이지에서 기능 작동
app_name = 'users'
urlpatterns = [
path('', views.users, name='users'),
path('profile/<str:username>/', views.profile, name='profile'),
path('<int:user_id>/follow/', views.follow, name='follow'),
]
views.py
profile
- 팔로우 버튼이 작동할 공간
get_object_or_404(get_user_model(), username=username)
- 사용자의 정보를 가져와서 페이지 표시
- 템플릿 설정
- 본인이 접속한 경우 팔로우 버튼 비활성화
if request.user != member
def profile(request, username):
member = get_object_or_404(get_user_model(), username=username)
context = {"member": member}
return render(request, "users/profile.html", context)
follow
- 팔로우 기능 처리
if request.user.is_authenticated:
: 로그인 필요if member != request.user:
: 본인은 팔로우 불가if member.followers.filter(pk=request.user.pk).exists():
- 이미 팔로우 중인경우 클릭 시 언팔로우
@require_POST
def follow(request, user_id):
if request.user.is_authenticated:
member = get_object_or_404(get_user_model(), pk=user_id)
if member != request.user:
if member.followers.filter(pk=request.user.pk).exists():
member.followers.remove(request.user)
else:
member.followers.add(request.user)
return redirect('users:profile', username=member.username)
else:
return redirect("accounts:login")
댓글 기능 수정
- 작성자 표시 및 삭제 권한 설정
models.py
articles
: 게시글의 부속 기능- 사용자 정보 테이블 추가
class Comment(models.Model):
...
user = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="comments"
)
...
템플릿
comment.user
으로 접근 가능