Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 정리
- AWS
- 종류
- linux
- TIL
- Go
- airflow
- 데이터 파이프라인
- redshift
- 데이터 엔지니어링
- S3
- sql
- Django
- 데이터엔지니어링
- 데브코스
- PYTHON
- 운영체제
- dockerfile
- TCP
- HADOOP
- Docker
- 데이터베이스
- 자료구조
- http
- 데이터 웨어하우스
- 파이썬
- 컴퓨터네트워크
- 가상환경
- 컴퓨터 네트워크
- airflow.cfg
Archives
- Today
- Total
홍카나의 공부방
[Django] 즐겨찾기(좋아요) 기능 구현하기 본문
예시 HTML 템플릿은 아래와 같다.
<form action="{% url 'posts:list' %}" method="POST">
{% csrf_token %}
<input type="hidden" name="favorite_pk" value="{{ idea.pk }}" />
<button type="submit" name="action" value="favorite" class="fav-icon {% if idea.is_favorited %}selected{% else %}unselected{% endif %}">
{% if idea.is_favorited %}
<img src="{% static '{이미지 파일 경로}' %}" alt="favorites" />
{% else %}
<img src="{% static '{이미지 파일 경로}' %}" alt="favorites" />
{% endif %}
</button>
</form>
코드 이해에 도움이 되도록 Models.py 코드 일부를 추가한다.
class Idea(models.Model):
title = models.CharField(max_length=64)
image = models.ImageField(blank=True, upload_to='posts/%Y%m%d')
content = models.TextField()
interest = models.IntegerField(default=0)
devtool = models.ForeignKey(
Tool, on_delete=models.SET_NULL, related_name='idea_tool', null=True)
def is_favorited(self):
return IdeaStar.objects.filter(idea=self).exists()
class IdeaStar(models.Model):
idea = models.ForeignKey(
Idea, on_delete=models.CASCADE, related_name='like_idea')
View에는 POST 방식을 이용하여 POST 요청을 받으면
해당 요청의 맞는 name을 읽어 들이고, value가 일치하면 try except를 진행하는 방식으로 구성했다.
현재 POST 요청에 value로 담겨온 idea.pk 값을 pk로 삼는
Idea 모델의 객체를 idea_instance 변수에 담았다.
그리고 IdeaStar 모델의 객체중 idea_instance 객체를 외래키로 참조하는
객체( 이는 좋아요(즐겨찾기) 객체가 될 것이다. )가 존재한다면 해당 객체를 삭제하는
idea_star.delete()를 작성하였다.
이는 현재 즐겨찾기 상태에서 유저가 즐겨찾기 버튼을 누르면
해당 객체의 즐겨찾기 상태가 해제되는 것을 구현한 것이다.
그리고 IdeaStar.DoesNotExist 예외를 넣어주면서
현재 idea 객체가 즐겨찾기 상태가 아니면, 즐겨찾기 객체를 만들고
즐겨찾기 상태라는 것을 추가해줬다.
def posts_list(request, *args, **kwargs):
idea = Idea.objects.all()
if request.method == "POST":
favorite_pk = request.POST.get('favorite_pk')
action = request.POST.get('action')
if favorite_pk and action == 'favorite':
idea_instance = Idea.objects.get(pk=int(favorite_pk))
try:
idea_star = IdeaStar.objects.get(idea=idea_instance)
idea_star.delete()
except IdeaStar.DoesNotExist:
idea_star = IdeaStar.objects.create(idea=idea_instance)
else:
pass
...
urls.py 같은 경우 본인의 프로젝트에 알맞게 수정해서 사용하면 된다.
반응형
'Web > Django' 카테고리의 다른 글
[Django] DB(sqlite3) 초기화 하기 (0) | 2023.04.24 |
---|---|
[Django] Windows에서 Git Bash로 가상환경 활성화가 안될 때 (0) | 2023.02.26 |
[Django] 새로운 프로젝트 만들 때 초기 설정 확인 과정 (0) | 2023.01.18 |
[Django] 장고 명령어 정리(치트시트) - 1 (0) | 2023.01.12 |
[Django] 장고 CRUD 간단 요약 (0) | 2023.01.11 |