게시글
질문&답변
2024.11.14
[11-30] 강의 crispy form 적용에서 오류가 발생해서 관련 문의 드립니다.
안녕하세요.템플릿에서는 특별한 점이 안 보이구요.crispy form은 Form 코드가 핵심이거든요. 현재의 댓글 Form 파이썬 코드를 공유해주시겠어요?
- 0
- 2
- 27
질문&답변
2024.11.14
cover_image_tag(self) 부분 질문이 있습니다.
안녕하세요.말씀하신 대로 파이썬 클래스에서 self 는 java나 c++의 this와 같은 역할입니다. java나 c++에서는 this를 암시적으로 받지만, python에서는 명시적으로 전달받도록 되어있습니다. self 는 우리가 메서드 호출 시에 직접 지정하지는 않구요. 인스턴스를 통한 메서드 호출에서는, 자동으로 self에 현재 인스턴스가 지정됩니다.(사진)그리고, ModelAdmin의 list_display 속성에 지정한 이름에서우선순위가 ModelAdmin 클래스 내의 메서드에서 먼저 찾아보고 있다면 호출해서 사용하구요.ModelAdmin 클래스 내에 해당 이름의 메서드가 없다면, 관련 모델의 메서드에서 찾습니다.ModelAdmin 클래스가 1순위이고, Model 클래스가 2순위입니다.화이팅입니다. :-)
- 0
- 1
- 19
질문&답변
2024.11.09
models.py와 _song.html의 연결에 대해서 질문있습니다.
옙. 맞습니다. 제가 좀 더 보충을 해보겠습니다.list comprehension 문법은 아래처럼 풀어서 생각하시면 이해하시기 좋습니다. 새로운 리스트를 생성하는 데, for 키워드 앞에 지정한 식을 평가해서 리스트의 새 항목으로 append 하는 문법입니다.(사진) 장고는 서버 구동 시에 url patterns 리스트에 등록된 path 목록을 정리를 해두구요.클라이언트로부터 HTTP 요청이 들어오면, 그 요청 URL에 매칭되는 path를 찾고, 그 path와 연결된 View 함수를 호출하여, 해당 요청을 처리합니다. 지금은 index 함수이구요.View 함수가 호출되어 처리되는 동안에 클라이언트는 응답을 기다립니다. 브라우저에서 모래시계가 빙글빙글 돌고 있는 상황일 것입니다.index 뷰 함수는 다양한 포맷의 응답을 할 수 있는 데요. 여기에서는 render 함수를 활용하여, HTML 포맷의 응답을 생성했습니다.render 함수의 세번째 인자로 템플릿 내에서 참조할 값 목록을 사전(dict) 타입으로 지정합니다. 어떤 타입의 값이든 템플릿 내에서 참조할 목적이라면 모두 지정할 수 있습니다.장고 템플릿의 for 반복문 코드는 파이썬의 for 반복문과 동일한 방식으로 동작합니다.(사진)song 은 Song 인스턴스이니까, like_count 속성이 있으니 참조하여 출력할 수 있습니다.
- 0
- 3
- 41
질문&답변
2024.11.08
models.py와 _song.html의 연결에 대해서 질문있습니다.
안녕하세요.View에서는 render 함수 호출을 통해 지정 템플릿을 통해 문자열 응답을 생성할 수 있습니다.render 함수 호출 시에는두번째 인자 template_name 에는 사용할 템플릿 파일의 경로를 지정하구요.세번째 인자 context 에는 사전(dict) 타입으로서 템플릿 내에서 참조할 변수값 목록을 지정합니다.song_list는 index 뷰 함수 내에서 아래의 코드로, Song 인스턴스로 구성된 리스트가 됩니다. 한 줄의 코드로 이렇게 리스트를 생성하는 문법을 list comprehension 이라고 부릅니다. 파이썬에서 사용 빈도가 높은 문법입니다.(사진)Song 클래스의 클래스 메서드인 from_dict 코드는 아래와 같구요. 호출 시에 Song 인스턴스를 반환합니다.(사진)그럼 song_list 는 Song 인스턴스로 구성된 리스트니깐요. 아래의 코드에서 song_list를 순회돌며, 매 Song 인스턴스가 song 변수에 할당이 될 것입니다.(사진)이어서, hottrack/_song.html 템플릿 파일에서도 song 객체가 그대로 전달이 되구요. song 객체는 Song 클래스의 인스턴스니까, (사진)song.like_count 와 같은 코드로 각종 속성에 접근할 수 있게 됩니다. 장고 템플릿 문법으로는 중괄호 2개로 감싸서 값을 표현합니다. 그럼 코드가 {{ song.like_count }} 처럼 됩니다.(사진)살펴보시고 추가 질문은 댓글 남겨주세요. 화이팅입니다. :-)
- 0
- 3
- 41
질문&답변
2024.11.07
각 섹션의 강의 목표을 알고 싶습니다.
안녕하세요.피드백 감사드립니다. 👍강의소개 페이지에 각 섹션의 목적에 대해서 보다 잘 이해하실 수 있도록 개선해보겠습니다. 지금은 섹션(0)과 섹션(1)의 설명을 재작성했구요. 곧 나머지 섹션에 대해서도 설명을 보완하겠습니다.https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-with%EB%A6%AC%EC%95%A1%ED%8A%B8(사진)살펴보시고, 의견이나 궁금한 점 있으시면 이렇게 메시지 남겨주시면 적극 반영하겠습니다.정말 감사드립니다. 😉이진석 드림
- 0
- 2
- 40
질문&답변
2024.11.02
외래키 관계라는게 무슨 의미인지 잘 모르겠습니다.
안녕하세요.DB는 익숙하지 않으시더라도 엑셀은 익숙하실 텐데요. 하나의 엑셀 파일을 워크북(workbook)이라고 하구요. 그 워크북 안에 다수의 워크시트(worksheet)를 저장할 수 있습니다. 워크북을 DB에서는 "데이터베이스 (Database)" 라고 부르고, 워크시트를 "테이블 (Table)" 이라고 부릅니다.엑셀에서는 워크시트에 데이터를 저장할 때 유연하게 원하는 Cell에 이곳저곳 Cell에 자유롭게 데이터를 저장할 수 있지만, 우리가 흔히 쓰는 "관계형 데이터베이스"에서는 엄격하게 행과 열에 맞춰 데이터를 저장해야만 합니다.엑셀에서 아래와 같이 blog_post 시트에 포스팅 데이터를 저장할 수 있겠구요. 각각의 포스팅을 식별하는 식별자를 id 컬럼을 두었는 데요. 이를 기본키(primary key)라고 부릅니다.(사진)댓글 데이터는 시트의 특성상 blog_post 시트에 담을 수는 없구요. 아래와 같이 별도의 시트(DB에서는 테이블)에 저장해야합니다. 이때 어떤 포스팅에 대한 댓글인지를 post_id 컬럼에 저장토록 설계를 하게 됩니다. post_id 컬럼에 저장된 값은 blog_post 시트에서의 식별자를 지정하구요. 이를 외래키 (Foreign Key) 라고 부릅니다.(사진)살펴보시고, 추가 질문은 댓글로 남겨주세요. 질답을 이어가며 이해도를 높여가보시죠.화이팅입니다!!! :-)
- 0
- 2
- 45
질문&답변
2024.11.01
웹훅 사용과 관련하여 질문 드립니다.
안녕하세요.포트원에서의 웹훅 정책에 대해서는 공식문서를 통해 확인하실 수 있습니다. 해당 문서에서 아래 내용을 가이드하고 있구요. 웹훅은 기본 1회만 전송하고, 포트원 측에 따로 요청하면 최대 5회까지 1분 간격으로 재시도토록 설정할 수 있다고 합니다.(사진)현재의 결제 구현에서 웹훅은 "결제 프로세스"가 끝났음을 알려주는 알림 메시지일 뿐이구요. 웹훅이 없더라도 order.update() 메서드를 호출하여 직접 결제 상태를 갱신하실 수도 있습니다. 결제가 끝난 유저의 주문 페이지에서 "결제상태 새로고침" 버튼을 노출하여, 유저가 그 새로고침 버튼을 클릭하면 결제상태를 갱신토록 하셔도 좋겠구요. 혹은 유저에게 그 버튼을 노출하기 전에, 서비스 내부적으로 새로고침을 한 번 수행해보는 접근도 좋을 듯 합니다. 혹은 주문페이지의 프론트 단에서 JS로 수 초 단위로 새로고침 요청을 해도 좋겠죠. :-)
- 0
- 2
- 25
질문&답변
2024.10.29
cancel에 대해 질문을 드립니다.
order.orderpayment_set.all() 코드는 한 order 의 결제 시도 목록을 조회합니다. for 반복문에서는 0개 OrderPayment 목록을 순회돌게 되구요. 그런데, OrderPayment 모델에서 결제에 성공할 경우, 다른 다수의 결제 시도 건들을 모두 삭제하기에, Order 마다 1개의 OrderPayment 만이 있을 것입니다.(사진)각 payment.cancel(reason=reason) 호출 시마다, 각 결제의 merchant_uid 값을 통해 포트원 측에 결제취소를 요청합니다. 결제취소 요청에 대한 응답으로 결제상태를 갱신하거나, 결제취소 요청이 실패할 경우 self.update() 호출을 통해 결제상태 갱신을 재요청토록 구현되어있습니다.(사진)살펴보시고 댓글 남겨주세요. :-)이전 질답 링크는 아래에 남겨두겠습니다.https://www.inflearn.com/community/questions/1415408/cancle%EC%97%90-%EB%8C%80%ED%95%B4-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4
- 0
- 2
- 26
질문&답변
2024.10.29
cancle에 대해 문의 드립니다.
설명하신 내용이 맞습니다.말씀하신 것처럼 결제가 된 건에 대해서만 취소 요청을 하실 수도 있습니다.order.orderpayment_set.all() 은 한 order 내의 모든 결제시도(payment) 목록을 조회합니다. 아래의 코드는 한 order 내의 모든 결제시도에 대해서, 별도의 상태조회없이 cancel을 시도합니다.for payment in self.orderpayment_set.all(): payment.cancel(reason=reason)위와 같이 코드를 작성한 이유는 포트원 측에서는 결제가 되었는 데 네트워크 이슈, 비정상 종료 등의 이유로 웹훅을 받지 못해서, 우리 서비스에서는 결제완료 상태로 갱신되지 않았을 가능성이 아주 적은 확률이지만 있을 수도 있다고 생각했기 때문입니다. 그래서 러프하게 모든 결제시도 건에 대해서 cancel을 요청한 것이었습니다.다수의 cancel api 요청으로 인해, 요청건수에 비례해서 처리시간이 늘어날 수 있는 데요. 이때 병렬로 요청을 처리하시면 처리시간을 대폭 줄이실 수 있는 데요. asyncio를 활용하실 수도 있구요. 그런데 이는 ASGI 방식으로 장고 구동 방식을 변경해야하구요. 기존의 WSGI 방식 구동에서는 gevent 라이브러리를 활용해서 병렬로 요청을 처리하실 수 있습니다.
- 0
- 3
- 56
질문&답변
2024.10.29
m_redirect_url에 대해 문의 드립니다.
안녕하세요.설명하신 내용이 모두 맞습니다.모바일 브라우저에서는 결제 시도 시에 페이지 전환이 필연적으로 발생하기 때문에, js 콜백함수가 호출이 될 수 없습니다.
- 0
- 1
- 26