ManyToManyField 데이터 불러오기
543
작성한 질문수 10
안녕하세요!
User와 Job 두 모델이 있습니다.
ManytoMany필드를 통해 Job들 중에서 User가 좋아한 Job들만을 따로 보여주고 싶습니다. 그런데 여러번 함수를 바꿔서 시도해도 데이터가 제대로 보여지지 않는 것 같아요. 어떤 부분에서 실수를 한건지 살펴주실 수 있나요?
1. Model.py
class User(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
password = models.CharField(max_length=50)
objects = UserManager()
class Job(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=255)
location = models.CharField(max_length=255)
poster = models.ForeignKey(User, related_name='user_post', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
user_likes = models.ManyToManyField(User, related_name='liked_job')
objects = JobManager()
2. view.py
def add_like(request, id):
liked_job = Job.objects.get(id=id)
user_liking = User.objects.get(id=request.session['id'])
liked_job.user_likes.add(user_liking)
return redirect('/dashboard')
3. .html
1) 좋아요 기능 구현한 부분
<tbody>
{% for job in jobs %}
<tr>
<td>{{ job.title }}</td>
<td>{{ job.location }}</td>
<td><a href="view/{{ job.id }}">View</a> |
<a href="like/{{ job.id }}">Add</a> |
<a href="edit/{{ job.id }}">Edit</a>
{% if job.poster.id == request.session.id %}
|<a href="/delete/{{ job.id }}">Cancel</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
2) 데이터 표현 구간
{% for job in job.user_likes.all %}
<tr>
<td>{{ job.title }}</td>
<td><a href="view/{{ job.id }}">View</a></td>
<td><a href="view/{{ job.id }}">Done</td>
</tr>
{% endfor %}
답변 2
1
정성 스러운 답변에 늘 감사드립니다!
데이터필드를 공부하기 위해서는 장고쉘과 친해져야 한다는 것을 새로 배웁니다.
위에 있었던 문제는 view.py 를 다음과 같이 새로 구성하면서 해결하였습니다!
def favorite(request, id):
user = User.objects.get(id=request.session['id'])
job = Job.objects.get(id=id)
user.favorited_jobs.add(job)
return redirect('/dashboard')
def unfavorite(request, id):
user = User.objects.get(id=request.session['id'])
job = Job.objects.get(id=id)
user.favorited_jobs.remove(job)
return redirect('/dashboard')
설날 연휴 잘 보내셨기를 바라며, 2022년 한 해도 행복한 일이 많이 일어나시기를 바랍니다. :)!!
0
잘 해결하셨다니 다행입니다. :-)
하나만 덧붙이자면, queryset.get 을 사용하실 때에는 지정 조건의 Rows가 1개만 있으면 그 Row를 통해 모델 인스턴스가 반환되지만, 지정 조건의 Rows가 없거나 2개 이상의 Rows가 있을 경우 DoesNotExist 예외 혹은 MultipleObjectsReturned 예외가 발생할 수 있습니다. 뷰 함수에서 어떠한 예외가 발생하면, 클라이언트 측에는 500 Internal server error 응답이 가게 됩니다. 지정 조건의 Rows가 없는 것은 서버 에러가 아니라 404 not found 응답으로 처리되는 것이 맞습니다.
그러니, 뷰 함수에서 모델 인스턴스를 획득하실 때에는 직접적으로 queryset.get 를 사용하시기보다, get_object_or_404 숏컷 함수를 사용하시기를 권장드립니다.
공식문서 : https://docs.djangoproject.com/ko/4.0/topics/http/shortcuts/#get-object-or-404
0
안녕하세요.
아래와 같이 관계를 처리하는 코드를 장고쉘(python manage.py shell)을 통해서 확인해보시면, 보다 명확하게 처리 내역을 확인하실 수 있습니다.
데이터베이스 저장 내역을 DB에 직접 접속해서 확인해보시거나, 장고 admin을 통해서 데이터 저장을 먼저 확인해보세요. 저장이 잘 되어있다면 보여주는 부분에서 오류가 있을 테구요. 저장이 되어있지 않다면 저장하는 부분에서 오류가 있을 것입니다.
데이터가 잘 저장이 되어있다면, 아마도 템플릿 단에서 참조하는 context 이름에 맞춰, 뷰 render 단에서 적절히 값을 넘겨주지 않았을 수도 있습니다. 넘겨주셨다면 이름에 오타가 있을 수도 있구요.
화이팅입니다. :-)
안녕하세요.
0
48
1
[OneToOne Field Demo] get_user_model() 메서드를 활용해야 하는 이유?
0
273
1
useEffect 훅에서 else 유무에 따른 결과
0
211
1
useAxios 훅의 dependency array 설정
0
245
1
useEffect에서 변수 업데이트 관련 질문
0
381
1
rest_framework.generics.CreateAPIView의 model 속성 유무
0
266
1
bootstrap4
0
470
4
리뉴얼 강의가 오픈이 되면 기존 강의는 더이상 못보는걸까요
1
363
1
admin form에서 앞선 필드 선택 후 다른 필드 select widget 구성하는 방법
0
572
3
useState는 필수일까요?
0
261
1
python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.
0
597
4
Django allauth를 사용한 소셜 로그인 시 에러
0
654
1
프로젝트명 변경 뒤, 디버그툴바+디버그모드 사용 시 에러
0
552
2
useLocalStorage() 함수 사용여부
0
228
1
django에 LOGIN_URL = '/accounts/login/'의 의미?
0
448
1
리듀서의 의미 재확인
0
430
1
simple-jwt Refresh Token 사용 노하우
0
897
2
docker compose 를 통한 배포 관련 오류 문의
0
670
1
파이썬 속도 장고 관련 궁금한게 있습니다.
0
364
1
is_like_user
0
233
1
related_name 오류
0
272
1
re_path 오류
0
258
1
re_path url
0
249
1
No post matches the given query
0
660
2





