묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
product model에서 category는 FK로 주셨는데, status는 왜 chocies로 주신 이유?
category는 동적으로 추가할 가능성이 있지만,status는 상태가 추가될 가능성이 드물기 때문에 이렇게 모델 설계를 하신게 맞을까요?
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
강의 PDF 파일 문의
강의 PDF 파일이 제공된다고 대시보드에 써있는데 혹시 어디서 다운 받을 수 있을까요?강의를 다 보고 나서 PDF파일로 복습하려고 하는데 어디 있는지 못찾겠습니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
11장 팔로잉 기능 구현 관련
11장 팔로잉 기능 구현에서는팔로잉 하는 목록 페이지팔로우 하고 있지 않는 목록 페이지두 가지를 구현하였습니다.이를 기반으로 인스타그램처럼 프로필을 카드기반으로 꾸미고 10-12 에서 구현한 무한 스크롤을 적용하였습니다. 프로필 페이지에서 구현한 프로필 카드를 목록에서 재활용하여 반복을 줄이고자 했습니다.대부분의 기능은 구현하였습니다만, 강의의 내용만으로는 스스로 해결하기 힘든 점들이 있어 질문글을 파란색으로 남깁니다. 우선, 팔로잉 목록과 언팔로인 목록을 나눈 경우 언팔로잉 목록에서 내가 팔로잉 한지 모르고 검색한 경우 유저 목록이 검색되지 않는 불편함이 존재할 수 있습니다.물론 인스타 그램의 경우 강사님께서 구현한 것처럼 탭을 나누어서 구현하였으니 이는 문제가 아닐 수 있습니다.그러나 하기의 사진은 정확한 예시는 아닐 수 있으나 내 팔로워들 중 내 팔로잉 여부를 확인할 수 있는 페이지를 구현하고 싶습니다.인스타 팔로워 페이지인스타 팔로잉 페이지 따라서 팔로우하지 않는 목록 페이지를 유저 목록들이 모두 나열되면서 눈으로 팔로우 여부를 확인할 수 있는 페이지로 구현하고자 합니다. 하기는 현재 구현한 목록 페이지의 일부 입니다.개인 프로필 페이지에서는 팔로잉 버튼 대신 edit 버튼이 활성화 됩니다.해당 페이지를 구현하기 위해 11장에서 구현한 두 함수를 generic ListView를 상속받은 class 기반 뷰로 구현하였습니다.# views.py @method_decorator(login_required_hx, name="dispatch") class DiscoverListView(ListView): model = User paginate_by = 12 context_object_name="user_list" def get_queryset(self): qs = User.objects.all() user: User = self.request.user follow_relation = self.kwargs.get("follow_relation", False) # url로 부터 받는 인자 match follow_relation: case "following": qs = user.following_user_set.all() case "followed": qs = user.followed_user_set.all() # qs = User.objects.exclude(id__in=user.following_user_set.all()) qs = qs.exclude(id__in=[user.pk]).select_related("profile").prefetch_related("follower_user_set", "following_user_set") query = self.request.GET.get("query", "").strip() if query: qs = qs.filter( Q(username__icontains=query) | Q(full_name__icontains=query) | Q(email__icontains=query) ) return qs.order_by("username") def get_template_names(self) -> list[str]: # htmx로 요청이 들어오면 검색바 등 불필요한 위 아래 내용 제거 후 내용만 업데이트 if self.request.htmx: template_name = "accounts/_user_list.html" else: template_name = "accounts/user_list.html" return [template_name] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # is_follwer 는 html에서 follow 버튼을 구분하기 위한 인자 # context['is_follower'] = True if self.kwargs.get("follow_relation", False)=="following" else False qs = self.get_queryset() follow_dict = { q.username:self.request.user.is_follower(q) for q in qs } context['follow_dict'] = follow_dict query = self.request.GET.get("query", "").strip() context['query']=query return context여기서 .prefetch_related("follower_user_set", "following_user_set") 을 통해 모델에서 구현한 팔로워와 팔로잉 유저 수를 불러오는 property를 templates에서 호출할 때 N+1 문제를 해결하고자 하였습니다.<!-- _user_profile_card.html --> {% load static %} <div class="card" style="border-radius: 15px;"> <div class="card-body p-4"> <div class="d-flex"> <div class="flex-shrink-0"> {% if user.profile.avatar %} <img src="{{user.profile.avatar.url}}" alt="{{user}}'s avatar" class="img-fluid" style="width: 180px; border-radius: 10px;"> {% else %} <img src="{% static 'images/profile-icon-design-free-vector.jpg' %}" alt="{{user}}'s avatar" class="img-fluid" style="width: 180px; border-radius: 10px;"> {% endif %} </div> <div class="flex-grow-1 ms-3"> <h5 class="mb-1" style="display:inline">{{ user.full_name }} </h5> {% if user.profile.team %} <h6 class="text-muted" style="display:inline">{{ user.profile.team }}</h6> {% endif %} <p class="mb-1 pb-1">{{ user.email }}</p> <div class="d-flex justify-content-start rounded-3 p-2 mb-2 bg-body-tertiary"> <div> <p class="small text-muted mb-1">Data</p> <p class="mb-0">TDA</p> </div> <div class="px-3"> <p class="small text-muted mb-1">Followers</p> <p class="mb-0">{{user.follower_count}}</p> </div> <div> <p class="small text-muted mb-1">Following</p> <p class="mb-0">{{user.following_count}}</p> </div> </div> <div class="d-flex pt-1"> {% if request.user == user %} <a href="{% url 'accounts:profile_edit' %}" class="btn btn-outline-primary btn-sm"> <i class="bi bi-pencil-square"></i> 프로필 수정 </a> {% else %} {% comment %} {% include "accounts/_user_follow.html" with username=user.username%} {% endcomment %} {% include "accounts/_user_follow.html" with is_follower=follow_dict.user.username username=user.username%} {% endif %} </div> </div> </div> </div> </div>프로필 카드 내에서 팔로워와 팔로잉 수를 보여주기 위해 접근한 제 방식이 맞는지가 궁금합니다. models.py에서 구현한 follower_count 또는 following_count를 template에서 호출하는 방식이 일반적인 접근 방식인가요?그 다음 제가 위에서 구현하고자 한 유저별 팔로우 여부를 get_context_data에서 follow_dict 라는 변수명으로 저장하여 하기와 같이 template에 넘겨주었습니다.<!--user_follow.html--> {% include "core/_messages_as_event.html" %} {% load keyvalue %} {% if follow_dict|keyvalue:username %} <a href="#" hx-post="{% url 'accounts:user_unfollow' username %}" hx-swap="outerHTML" class="btn btn-sm btn-primary"> <i class="bi bi-person-check-fill"></i> 팔로잉 중 </a> {% else %} <a href="#" hx-post="{% url 'accounts:user_follow' username %}" hx-swap="outerHTML" class="btn btn-sm btn-secondary"> <i class="bi bi-person-add"></i> 팔로잉 하기 </a> {% endif %}dictionary 키 값으로 변수를 입력하는 것이 django template에서 지원되지 않기 때문에 하기의 함수를 등록하여 활용하였습니다.register = template.Library() @register.filter def keyvalue(dict, key): return dict[key]결과물은 구현한 페이지처럼 잘 보여지지만, 두 가지 문제가 존재합니다.확실치 않지만 하기의 코드에서 N+1 오류가 발생하는 것으로 보입니다.follow_dict = { q.username:self.request.user.is_follower(q) for q in qs }팔로잉 혹은 언팔로잉 요청 시 500 서버 에러가 발생합니다. 아마도 follow_dict가 요청 시에 업데이트 되지 않아 발생하는 오류로 보입니다. 이러한 점 때문에 인스타그램에서도 따로 탭을 두어서 관리하는가 싶기도 합니다만 이를 해결할 방법이 있을까요?어렵다면 팔로워 목록에서 내가 팔로잉 하는지 여부를 표기하는 인스타그램 페이지는 어떻게 구현해야 할까요?
-
미해결실전! Django 활용
urls.py 파일에 작성한 코드 분리 여부
안녕하세요. 정말 강의 재밌게 잘 듣고 있습니다.들으면서 궁금한 부분이 있어 질문드립니다./orders API를 예시로 들었을 때, urls.py 파일에 모든 코드가 작성되는데, 쿼리나 비즈니스 로직을 따로 분리하는 방식은 파이썬 프레임워크에서는 잘 사용하지 않는 방법인가요? 일반적으로 스프링에서는 service와 respository 클래스로 해당 코드를 분리하는 편이어서 이 차이점이 궁금합니다.
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
urls.py에 라우팅 하는 부분에서요.
config/urls.py가 있고, 앱을 만든다면 apps/urls.py가 꼭 필요한가요? config/urls.py 안에 다 넣을 수 있지 않을까요?
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
선생님 from iamport import Iamport 에서 에러가 생깁니다.
Cannot find reference 'Iamport' in '__init__.py' 라면서 참조를 못합니다ㅜ파이참 쓰고 있고 init_py 파일에는이 소스가 끝입니다 ㅜ 나머지 client.py, client.pyi에는 Iamport가 클래스로 정의되어 있는데 왜 이런지 모르겠습니다ㅜ
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
db_index=True로 설정하는 이유
빈번하게 해당 필드의 값을 기준으로 select query가 일어날 만한 조건이 된다고 판단하셔서db_index=True로 해주신걸까요?ex) 특별한 결제 상태의 payment만 조회Payment 모델 만드실 때 특별한 설명이 없으셔서, 질문 남겨요.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
안녕하세요 모든 회차의 동영상이 나오지않고 다음과 같이 화면이 출력됩니다.
소리는 나오는데 영상 재생에 문제가 있는것 같아요. 확인 부탁드립니다.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
안녕하세요 파이참 폼링크 제출했습니다
확인부탁드립니다 감사합니다!
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
handler, static 질문이 있습니다.
안녕하세요,mysite>urls.py에handler404 = 'mysite.views.error_404_view' # #404에러 발생시 처리 handler500 = 'mysite.views.error_500_view'이렇게 작성하고,views.py 에서 def 로 함수 정의해서 쓰는데요.handler404, handler500 views.py에 context로 연결하는 예제 하나만 보여주시면 안될까요.원래 질문은 handler404, handler500를 어디에 쓰는지 모르겠다 였는데, 강의 후반부에 context로 연결해서 쓴다고 말씀해주셔서 질문을 바꿨습니다. 다른 질문은 static 부분에서 main.html 에서 <img src = "{% static 'mysite/django.png' %}" alt="Django image" />이렇게 작성해서 사용하는데, static을 settings.py에 정의해서 사용하신다고 알려주셨는데, 어떤 부분과 대응 되는지 잘 모르겠습니다. STATIC_URL ='/static/' 이부분 뒤로 붙어서 static/mysite/django.png 이런식으로 읽어오게 되는게 맞을까요?질문 받아주셔서 감사합니다.
-
미해결Vue.js - Django 연동 웹 프로그래밍
들여쓰기 단축키가 어떻게 되나요?
들여쓰기 단축키가 어떻게 되나요?
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
build: context 부분이 이해가 되지 않습니다.
context: . 대신에 다른걸 쓸 수 있다고 말씀해주시긴하는데, 제가 이해가 잘 안됩니다. services: app: build: context: .이부분만 다시 설명해주실수있으실까요?
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
포트원 UI가 바뀌면서 포트원 404에러가 발생합니다.
안녕하세요. 강의 잘 듣고 있습니다.가이드 주신대로 포트원 회원가입을 하고, 테스트 채널을 추가했습니다.PORTONE_SHOP_ID 를 변경하여 결제를 생성해도포트원 404 에러가 발생합니다.포트원에서 UI가 업데이트 되었습니다.그래서 대표설정을 찾지 못하였습니다.이 부분 같이 고민해주실 수 있을까요? https://github.com/pyhub-kr/course-django-payment-basic/tree/10c6d065e401ce6a9daa262d1906d10f2f9e69c3여기 깃허브를 클론한 뒤 제 .env파일을 넣어서 테스트해도 포트원 404 에러가 발생합니다.
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
24년 8월 기준 flutter_swiper import 관련
flutter_swiper_view:로 변경되었음.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
강의 제목에는 리액트가 들어가있는데 리액트 내용은 좀 부실한거 같아요.
강의 제목에는 리액트가 들어가있는데 리액트 내용은 좀 부실한거 같아요. 오히려 htmlx가 더 많아요~~~ 리액트로도 다양한 예제를 만들어주셨으면 합니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
로그아웃 시 메서드 거절이 발생합니다.
auth LoginView/LogoutView에 success_url_allowed_hosts 설정 추가하여, 로그인/로그아웃 후에 지정 호스트로의 이동 허용현재 로그인/로그아웃후 지정 호스트로 이동을 허용하는 부분을 실습하고 있는데 막히는부분이 있어서 질문 드립니다. 이부분 코드를 붙여넣고 실행하였더니 로그아웃 부분에서 아래와 같은 에러가 발생하였습니다. (프로필 페이지로 이동은 잘 됩니다.)찾아보니 GET 메서드가 거절된 것같은데, 이전 강의에서 장고에서 과거에는 GET으로 받았으나, 이제는 POST 요청만 허용한다는 내용을 들은적이 있었던것같은데, 그것과 관련된 것인지 궁금합니다. 다른 분들은 잘되셔서 넘어가셨을텐데, 저가 잘못된것 같긴한데 혹시나해서 여쭈어봅니다.아래는 로그아웃 구현된 부분입니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
11-15) 프로필 수정에서 이미지 저장 시 문제
질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요.질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다.시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다.오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다. 당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-)인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 11-15 강의에서 구현한 프로필 수정 폼에서 이미지를 올린 경우, 다시 프로필 수정 페이지에 들어가면 정상적으로 이전에 등록된 이미지가 현재란에 보여집니다. 이렇게 구현된 모델은 문제가 몇 가지 있는데요.수정하지 않고 저장을 누를 경우 이전 강의에서 교육하신 내용처럼 접미사가 계속 바뀌어가면서 같은 내용의 파일이 spamming 되는 문제가 발생합니다.우리가 만약 프로필에 다른 항목이 추가된다면, 다른 항목만 수정하지 않고 나가는 유저가 있을텐데 해당 문제를 해결하려면 어떻게 해야할까요?수정 혹은 취소 체크 박스를 선택하여 삭제를 할 경우 여전히 경로 안에 파일이 남아 있습니다. signal을 이용하면 될 것 같은데, 하기와 같은 방법을 생각해 볼 수 있을까요?@receiver(pre_save, sender=Profile) def edit_delete_on_profile(instance=Profile, **kwargs): instance.avatar.delete(save=False)수업 내용과는 상관없지만, 기본 제공되는 이미지 업로드 양식이 어색합니다. 특히 취소 체크 박스를 체크하여 제거하는 방식은 너무 어색한데요. 더 좋은게 없을까요? 예를들어 아래는 네이버 '치지직' 에서 프로필 수정 양식입니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
가상환경 활성화 했을때 이름 설정
원래는 강의에서처럼 터미널에서 (venv)가 있어야 할 자리에 mydjango가 있었습니다 그런데 제가 로컬에서 다른 가상환경을 만들고 진행하니 이제 모든 파이참 환경에서 가상환경 설정할 때마다(venv)라고 활성화 되서 나오네요 얼마전엔 가상환경이름을 venv라고 설정해도 각각에 프로젝트에 맞는 이름들이 (django) 이런식으로 등장했는데 어떻게 원래대로 되돌릴 수 있는지 모르겠습니다.프로그램 실행에 지장이 있는건 아니지만 알려주시면 감사하겠습니다.
-
미해결<M.B.I.T> 테스트 페이지 만들기! with Django
data.json 파일을 어디 올려놓은 건가요??
ㅠㅠ https://www.notion.so/MBIT-My-Best-IT-personalities-3d9128d972054b498b98365f1df4e656#ea988d6fd9ef495daae54c5b9ae8c7e9여기에 파일이 없는데..
-
미해결<M.B.I.T> 테스트 페이지 만들기! with Django
python manage.py dumpdata main --output data.json로 생성된 파일의 글자가 깨짐 문제
[{"model": "main.developer", "pk": 1, "fields": {"name": "���ü��", "count": 0}}, {"model": "main.developer", "pk": 2, "fields": {"name": "����ü��", "count": 0}}, {"model": "main.developer", "pk": 3, "fields": {"name": "���ü��", "count": 0}}, {"model": "main.developer", "pk": 4, "fields": {"name": "����ü��", "count": 0}}, {"model": "main.developer", "pk": 5, "fields": {"name": "�ݾ�ü��", "count": 0}}, {"model": "main.developer", "pk": 6, "fields": {"name": "����ü��", "count": 0}}, {"model": "main.developer", "pk": 7, "fields": {"name": "����ü��", "count": 0}}, {"model": "main.developer", "pk": 8, "fields": {"name": "����ü��", "count": 0}}, {"model": "main.question", "pk": 1, "fields": {"number": 1, "content": "����� �� Ư¡�� ��մϱ�?"}}, {"model": "main.choice", "pk": 1, "fields": {"content": "��ī�Ӱ� �ѷ��� �λ�, �ε巴�� �ձ� �λ�, ��ü������ ���� �λ� ������ �λ�,", "question": 1, "developer": 1}}]깨져도 상관없는 것인가요?