[인스타그램] 세부 기능 구현하기
@receiver 데코레이터 는 Django의 시그널 프레임워크와 관련된 기능@receiver 데코레이터를 사용하여 신호 핸들러를 정의pre_save: 모델 인스턴스가 저장되기 전에 발생post_save: 모델 인스턴스가 저장된 후에 발생pre_delete: 모델 인스턴스가 삭제되기 전에 발생post_delete: 모델 인스턴스가 삭제된 후에 발생
@receiver(post_save, sender=Post)#(\w{1,100})(?=\s|$)#으로 시작하고 텍스트가 1~100글자 뒤에 공백 # 뒤에 바로 적어야 하고 띄어쓰기 존재하면 적용 안됨get_or_create instance.tags.clear() : 중계모델을 다 삭제 instance.tags.add(*tags) : 연결



@login_required 데코레이터 를 사용하여 같은 기능을 구현 가능Django의 제너릭 뷰를 사용하여 댓글을 생성하는 기능을 구현
commit = False

아직 댓글 작성 안됨
post = Post.objects.get(pk=self.kwargs.get('post_pk'))

prefetch_related('comments')

댓글 디자인 다듬기

| 기능 | 언제 사용? | 어떻게 동작? | 조인 발생? |
|---|---|---|---|
| select_related | ForeignKey, OneToOne(1:1, N:1) | JOIN 해서 한 번에 가져옴 | ✔ JOIN 발생 |
| prefetch_related | ManyToMany, RelatedManager(1:N), reverse 관계 | 두 번 쿼리하고 파이썬에서 매칭 | ✖ JOIN 없음 |
prefetch 없는 경우)prefetch_related 적용reverse: 즉시 평가 reverse 를 호출하면 바로 URL 문자열을 생성하여 반환reverse_lazy: 지연 평가reverse : 함수 기반 뷰(FBV)나 URL이 즉시 필요할 때 사용reverse_lazy : 클래스 기반 뷰(CBV)에서 속성을 정의할 때 사용 실제 인스타그램 처럼 댓글 / 내용 위치 변경

댓글작성 이라는 버튼을 없애고 말풍선 이모티콘을 누르면 댓글창이 나오도록 변경

템플릿 태그를 정의할 때 사용, 주로 커스텀 템플릿 태그를 만들 때 사용
템플릿에서 간단한 로직을 실행하고, 그 결과를 출력하고자 할 때 사용
템플릿 코드의 재사용성을 높이는 데 유용
from django import template
register = template.Library()
@register.simple_tag
def add(a, b):
return a + b
# 이 태그는 템플릿에서 `{% add 5 10 %}`와 같이 사용할 수 있으며, 결과는 `15`가 됩니다.
보안에 매우 중요한 보호 기능을 비활성화하는 것이므로, 정말 필요한 경우에만 사용권장.
CSRF(Cross-Site Request Forgery) 보호를 비활성화
Django는 기본적으로 모든 POST 요청에 대해 CSRF 보호를 적용
그러나 특정 뷰에서 CSRF 검사를 피하고자 할 때 이 데코레이터를 사용
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
# CSRF 검사가 비활성화된 뷰 로직
return HttpResponse("CSRF 보호가 없습니다.")



slug_field = 'nickname'User 모델의 nickname 필드임을 지정slug_url_kwarg = 'slug'<slug:slug>와 같이 정의된 부분이 있다면, nickname 필드와 매칭slug_field = 'nickname' / slug_url_kwarg = 'slug' 입력하지 않으면,

속도를 높이기 위해서 prefetch_related 사용

detail페이지 디자인




Django의 내장 앱 중 하나, 템플릿에서 숫자, 날짜 등을 보다 인간친화적인 형식으로 표시하는 데 사용
사용방법
INSTALLED_APPS = ['django.contrib.humanize', ]{% load humanize %}{{ 1234567|intcomma }} <!-- 출력: 1,234,567 -->{{ some_date|naturaltime }} <!-- 출력: 2 days ago -->{{ 3|ordinal }} <!-- 출력: 3rd -->{{ 3|apnumber }} <!-- 출력: three -->{{ 1000000|intword }} <!-- 출력: 1 million -->게시글이 1000개를 넘지않아 변화는 없지만 1000개 넘으면 1,000됨

만약 이미 팔로우가 되어 있다면, 팔로우 취소: member/models.py의 UserFollowing를 삭제
안되어 있으면 팔로우 시작: member/models.py의 UserFollowing를 생성
unique_together = ('to_user', 'from_user')

follow 되어 있으면 unfollow나오게 함




———————————————————————