본문 바로가기

django.core.exceptions.FieldError: Related Field got invalid lookup: icontains django.core.exceptions.FieldError django.core.exceptions.FieldError: Related Field got invalid lookup: icontains 이렇게 에러나 가는 경우에 FK 관련된 내용을 검토해보시면 됩니다. 저 같은 경우에는 search_fields에 FK를 바로 썼더니 에러가 나더라고요. 당연한거죠 ! search를 column 단위로 해야지 object 단위로 하려고 하니까 에러가 발생할 수 밖에요 ! 예를 들어서 news라는 FK가 있다고 합시다. search_fields에 적어줄 때는 news의 어떤 컬럼인지 적어줘야 합니다. search_fields = ('news',) #error title이라는 column이 있다고 가정하고 작성.. 더보기
DRF Custom Permission DRF Custom Permission Django에서 특정 그룹에 속해있는 유저만 실행할 수 있는 viewset을 만들어봅시다 !! 일단 "NGEE" 라는 그룹이 생성되어 있다고 가정할 때 아래와 같은 permission 클래스를 하나 만들어줍니다. ngeePermission의 has_permission이 하는 일은 request.user.groups 이름을 가지고 와서 거기에 NGEE가 있는지 없는지를 리턴해줍니다. NGEE 라는 그룹에 속해있다면 True가 리턴될 것이고 반대로 속해있지 않다면 False가 리턴되겠죠? from rest_framework.permission import BasePermission class ngeePermission(BasePermission) def has_perm.. 더보기
Django Test - pytest, reuse, create db, migration 등 간단 소개 pytest -p no:warnings DJANGO TEST - PYTEST pytest를 사용하면 테스트 데이터베이스를 다시 만들지 않아도 되니까 테스트 시작 속도가 빠르죠. 그래서 많이들 사용하시는 것 같습니다. 저도 테스트 할 때 pytest로 돌리는데 일단 ini는 기본적으로 reuse 옵션을 주고 돌립니다. 이유는 이미 생성된 test db를 사용하고 싶기 때문이죠. pytest -s --reuse-db 하지만 처음 테스트를 돌리거나 모델(model)의 변경이 있었다면 기존 test db 구조와 테스트가 돌아가는 코드가 맞지 않겠죠. 예를 들어서 없는 테이블에 접근하려고 한다거나? 없는 컬럼을 사용해서 테스트 한다거나 등등 그럴 때는 --create-db 옵션을 주고 돌립니다. 다시 정리하면 p.. 더보기
Django Mysql Warning - utf8mb4 Django에서 DB를 mysql로 사용하는 경우에 아래와 같은 WARNING을 만나게 되는 경우가 있습니다. django_mysql.W003 The character set is not utf8mb4 for database connection 'default' HINT: The default 'utf8' character set does not include support for all Unicode characters. It's strongly recommended you move to use 'utf8mb4'. See: https://django-mysql.readthedocs.io/en/latest/checks.html#django-mysql-w003-utf8mb4 해당 문서를 확인해보니까 간단하.. 더보기
django-crontab 소개 (특정 모듈 주기적으로 실행하기) Django-crontab 적용하기 django-crontab으로 특정한 모듈을 주기적으로 실행하는 것이 가능합니다. 물론 직접 crontab에 잘 작성하는 것도 방법이겠지만 라이브러리로 어느정도 간단하게 관리가 가능하니까 사용하는 것이 좋을 것 같습니다. 설치는 pip install django-crontab settings.py에 아래와 같은 내용을 포함해줍니다. INSTALLED_APPS = [ ... ... 'django-crontab', ] ... ... CRONJOBS = [ ('* * * * *', 'app_name.file_name.def_name', '>> /log_path/log_file.log') ] INSTALLED_APPS는 당연한거니까 PASS ! CRONJOBS에 적절히 추가해.. 더보기
python / same log, mutiple logging (동일한 로그가 여러 번 찍힐 때) python log duplication 파이썬 로깅할 때 동일한 로그가 여러 번 찍히는데 아래와 같은 코드로 방지할 수 있습니다. if not logger.handlers: #... #이 경우에만 logger 생성한다. return logger logger.handlers가 없는 경우에만 logger를 생성해서 리턴하는 방식인데요. 여러 가지 방법으로 동일한 로그가 찍히는 것을 방지할 수 있는데 그중에서 간편한 방법에 속하는게 아닌가 싶네요 !!! 후처리 하지 마시고 한 번씩만 기록하도록 하는게 더 좋을 것 같아요. 로그가 정말 많이 쌓인다면 용량도 커질꺼고요. 처리하는데에도 시간과 비용이 소모되니까요. 더보기
Django Render로 넘어온 context 사용하기 Django Render, Context, Templates Django에서 Render로 template를 그려줄 때 같이 보내주는 context를 사용할 수 있습니다. #views.py result_json = {} .... return render(request, 'test.html', { 'sample_data':mark_safe (json.dumps(result_json, sort_keys=False, separators=(',', ':'))), }) sample_data를 사용하기 위해서 template에서는 아래와 같이 할 수 있죠. var data = jQuery.parseJSON(JSON.stringify({{sample_data}})); context가 꼭 json 형태여야 하는 것은 .. 더보기
Django Ckeditor File Upload Permission 아주아주 멋진 django ckeditor로 게시글 작성하는 Form을 만들 수 있습니다. 이미지 업로드, 파일 업로드도 구현하지 않고 그냥 Ckeditor에 있는 것을 사용해도 좋고요. 다만 file upload의 경우에 권한 에러가 나더라고요. 소스코드를 확인해보니까 Staff 이상만 업로드 할 수 있어서 저는 풀어서 사용하고 있습니다. 권한에 맞춰서 사용할 수 있도록 추가 구현하면 되겠죠? if django.VERSION >= (1, 8): urlpatterns = [ url(r'^upload/', views.upload, name='ckeditor_upload'), url(r'^browse/', never_cache(staff_member_required(views.browse)), name='c.. 더보기
Favicon Image Add to Django Admin Site 장고 어드민 사이트 (Django Admin Site)에 파비콘 이미지를 추가하는 방법을 요약해봤어요. 1. templates/admin/base_site.html 을 만들어서 원래 django에서 제공하는 base_site.html 내용을 그대로 붙여넣습니다. base_site.html의 위치는 ......../lib/python2.7/site-packages/django/contrib/admin/templates/admin에 있습니다. python 버전이나 virtualenv 환경에 따라서 약간 다를 수 있지만 django 아래 부터는 동일할거에요. 열어보시면 아래 그림과 같습니다. 물론 여기에 있는 코드를 고치면 되겠지만 서버로 배포할 때에는 또 서버에서 수정해야 하니까 불편하죠. 그래서 여러분의 .. 더보기
DRF - list_route, detail_route >> @action 변경 DRF (Django Resf Framework)에서 list_route와 detail_route는 각각 아래와 같이 변경해야 합니다. from rest_framework.decorators import action @action(detail=False) #list_route @action(detail=True, methods=['post']) #detail_route 이제 list_route, detail_route가 action으로 합쳐졌기 때문인데요. 아래 홈페이지 내용을 참고하세요. https://www.django-rest-framework.org/community/3.8-announcement/#action-decorator-replaces-list_route-and-detail_route a.. 더보기
django 'load staticfiles' and 'load static' django에서 {% load staticfiles %} 와 {% load static %} 둘 중에 어떤 것을 사용하는게 맞을까요? 공식 문서에서는 {% load static %} 을 추천하고 있습니다. https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#static pytest로 돌려보시면 {% load staticfiles %} >>>> {% load static %} 으로 변경하라는 warning이 계속 나와요. 이런 것들을 보았을 때 앞으로는 load static을 사용하는게 맞는 것 같습니다. 아마도 load staticfiles가 삭제될 예정이겠죠. 저도 load static으로 모두 변경했어요. 테스트 과정에서 나오는 warning.. 더보기
django allauth models 를 admin에서 unregister하기 django allauth 많이 사용하시죠. 저도 사용하고 있는데 진짜 단순한 기능만 몇 개 사용하는데 admin에서는 많은 model들이 추가로 불려져서 복잡해지곤 합니다. 그래서 저는 안쓰는 것들은 admin에서 안보이게 하고 싶었고요. 아래와 같은 코드로 일부 allauth에서 추가되는 것들을 admin에서 제거했습니다. admin.site.unregister(model_name) 이런 식으로 작성하시면 되는데 저는 EmailAddress, SocialAccount, SocialToken, SocialApp 모델을 사이트에서 안보이게 하고 싶었습니다. 일단 allauth를 추가하시고 admin 사이트에 들어가보셔서 사용하실 것들은 남기고 필요 없는 것만 unregister 하시면됩니다. 만약 소셜 .. 더보기
Selenium Webdriver 활용 Instagram Login 해보기 (Python) Selenium Webdriver를 활용하면 웹 파싱이나 반복작업 등을 처리할 수 있습니다. 여기서는 간단하게 Instagram Login을 해보는 과정을 작성해봅니다. 환경설정이나 라이브러리 설치는 건너뛰고요. 저는 chromedriver를 활용해서 해보겠습니다. chromedriver는 아래 주소에서 받으실 수 있습니다. 적당한 곳에 다운로드 및 위치 해두면 됩니다. chromedriver : http://chromedriver.chromium.org/ 일단 인스타그램 로그인 페이지를 띄워보고 어떻게 할지 작성할게요. 아래와 같은 창인데요. 단순하게 Id 역할을 하는 phone number, username, or email 입력하는 input이 하나 있고요. password input이 하나 있습니.. 더보기
Django Admin : site register Django Admin 페이지에서 site를 추가해보면 domain_name과 display_name이 나옵니다. ID는 표시되지 않는데요. 가끔 setting.py 에 SITE_ID를 적어야 하는데정확한 값을 알려면 DB를 접속하거나 CODE를 더 작성해야 하니까요. ID가 표시되면 좋겠죠. 아래와 같이 ID를 추가하려면 site를 unregister를 통해 해제했다가 다시 register를 통해 불러와야 합니다. 코드는 아래와 같습니다. 더보기
Django Rest Framework : 3.5 to 3.8 Django + Django Rest Framework 버전업이 쭉쭉 되는 것 같아요. 아니면 제가 좀 늦게 버전업을 따라가는 걸지도 모르겠네요. 3.5 to 3.8에서 아래와 같은 warning이 발생하더라고요. 감히 DEFAULT_PAGINATION_CLASS를 설정하지 않고 PAGE_SIZE를 설정했다고 하는군요. 해결 방법은 DEFAULT_PAGINATION_CLASS를 설정하거나 PAGE_SIZE 설정을 닫거나 이겠죠.저는 PAGE_SIZE 설정을 주석처리 해버렸습니다. DEFAULT_PAGINATION_CLASS 와 관련한 DRF 문서는 http://www.django-rest-framework.org/api-guide/pagination/#pagination 요걸 참고하시면 될 것 같습니다... 더보기
장고 어드민 커스터마이징 (Django Admin Customizing) 와 ! 아래 사이트 정말 좋네요. 장고 어드민 사이트 변경하고 싶을 때 항상 구글링 해왔는데요. 정말 잘 정리된 것 같아요. 요 내용 하나씩만 따라하면 왠만한 커스터마이징은 쉽게 할 수 있을 것 같습니다. 오랜만에 정말 마음에 드는 사이트를 알게되서 공유해봅니다. https://books.agiliq.com/projects/django-admin-cookbook/en/latest/ 더보기