보통 urls.py 파일에 여러가기 view 의 주소를 많이 지정해 둔다. 코딩중에 해당 페이지로 이동하거나 render 를 하고 싶다면 이 view 에 맵핑된 주소를 불러와야 하는데 주소를 바로 주게 되면 혹시 변경이 생기는 경우, 그냥 소스 전체를 찾아서 수정해야 한다. 이를 방지하기 위해 url 에 접근하는 함수가 몇개 있는데, 결론은 그냥 resolve_url redirect 이정도 쓰면 될듯 from django.shortcuts import resolve_url, redirect resolve_url('blog:post_detail', 10) # '/blog/10/' redirect('blog:post_detail', 10) 장고 템플릿에서 쓰는 방법은 다들 아는 바와 같이 아래처럼 사용하면 ..
LEFT JOIN 해서 테이블을 쫙 보여주고 싶었는데 ORM 의 기본기능으로는 안되는 건가? 일단 급한대로 raw sql을 직접 집어넣는 형태로 구현을 해 놓고 보자. item_list = Parts.objects.raw( "SELECT devices_parts.*, devices_lineparts.quantity \ FROM devices_parts \ LEFT JOIN devices_lineparts \ ON devices_parts.id=devices_lineparts.parts_id AND devices_lineparts.line_id=" + str(line_pk) + " ORDER BY devices_parts.group0_id ASC, devices_parts.group1_id ASC, dev..
원래 자동으로 Date picker 가 포함되는 widget이 나왔던 거 같은데, 잘 안되네. DB Model 에 날짜 관련 필드를 설정한 곳은 widget 이 date picker 같은 것이 가능하도록 나와야 한다. 아래 코드처럼, class Meta 에 해당 필드의 Widget 을 직접 지정해주면 머 당연히 된다. class Meta: model = CreateNewPatient fields = ['first_name', 'nickname','last_name', 'date_of_birth', 'school_grade', 'sex', 'school'] widgets = { 'date_of_birth': forms.DateInput(format=('%m/%d/%Y'), attrs={'class':'fo..
너무 기본적이라 알고 있을 수 있지만, 불편했기에 정리해둠 Form, Modelform, BSModalModelForm 에서 request 객체를 직접 접근이 안되기에, 왜 안될까 보는 중에 __init__ 함수 호출시에 매개변수로 넘어온다는 것을 보니 그냥 그값을 저장해서 사용하자는 접근 코드를 보는 것이 낫겠다 class ProductProfileUpdateForm(BSModalModelForm, ProductProfileForm): # date = forms.DateField( # error_messages = { # 'invalid': 'YYYY-MM-DD 입력' # }) title = "" is_admin = 0 class Meta: model = ProductProfile fields = __..
이거 가장 기본인데, 저장은 되는데 내가 그 값을 보고 쓸 수는 없다니, 말도 안된다. 쓰기만 하면 내부적으로 막 돌아가서 자동 저장되는 것처럼 보이니깐 막상 어떤 값을 뽑아 쓰려면 참나... 암튼 저장되는 객체의 필드를 참고하고 싶었는데 어떻게 참고해야 하는지 몰랐다. self.form_class.xxxx self.instance.xxxx self.form_class.instance.xxxx 다 실패, 정답은 self.object.xxxx @method_decorator(admin_required, name="dispatch") class PartsUpdateView(BSModalUpdateView): model = Parts filter = "" template_name = "devices/_moda..
자기 자신의 레코드 중에 하나를 Foreign Key 로 등록하는 경우와 필드를 합쳐서 중복이 생기지 않도록 설정하는 방법을 알아보자. 길게 설명이 필요없다. 그냥 아래 예제로 끝 class PartsGroup(models.Model): name = models.CharField(max_length=256, verbose_name="Name") level = models.CharField(max_length=1, default="0", verbose_name="Level", null=True, blank=True) parent = models.ForeignKey("self", on_delete=models.PROTECT, verbose_name="Parent", null=True, blank=True) ..
서비스를 만들다 보면 여러가지 텍스트가 많이 있다. 한국사람만 쓰면 그냥 한글로 하면 되는데, 국제화 시대에 맞추려면 이런 표기말들은 언어별 테이블에서 가져다 쓸 수 있도록 해야 한다. 친절하게 이런 기능들은 이미 Django 에 내장되어 있다. 일단 아래 함수를 먼저 알아야 하고, 그 함수를 라벨이나 다국어가 필요한 곳에는 반드시 적용해 둬야 한다. ugettext 함수나 ugettext_lazy 함수로 라벨을 등록해 두자. from django.db import models from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ class Article(models.Model):..
제목이 거창한데 Django Ninja API 엔진에 기본 인증 방식에 Redis 를 이용하여 사용자별 JWT 토큰 값을 하나만 관리하도록 설정해 보았다. 머 Blacklist 비슷한거 아닌가? 로그인 한 후에 Redis 에 사용자 ID 키로 토큰을 저장해 두고, 다시 Login API가 호출되면 새로운 token이 발행되도록 한다. 이렇게 하면 사용기한이 남은 토큰이라도 재 발행되는 순간 쓸 수가 없게 된다. Redis 대신에 그냥 Session 정도 사용되도 될 듯 하지만 머 일단 구색으로 class AuthBearer(HttpBearer): def authenticate(self, request, token): try: print(request.headers) print(request.headers..
전처리, 혹은 사용자가 중복으로 필요한 기능을 모아서 데코레이터로 작성해 두는 경우가 많다. 대부부의 함수에 적용시키거나 특정 함수에서 필요한 기능을 부분부분 적용시키는 데 최적이다. 일단 만들고 나면 대상 함수, 클래스에 적용하는 방법을 알아야 한다. Fuction based view 와 Class based view 에 적용 방법이 각각 다르다. 아래 사이트에 아주 잘 설명이 되어 있다. 원본 사이트로 들어가서 보시면 제 맘에 부담이 덜하겠네요 공부하는 것을 기록해 두는 용도지만 작성자의 노고를 위해서는 사이트로 가서 봐줘요 https://parkhyeonchae.github.io/2020/03/25/django-project-05/#2-decorator-%EC%A0%81%EC%9A%A9 그래도 정리..
장고에서는 아주 편리한 기능들이 거의 내장이 되어 있다. 숫자 표기시에 1000단위로 컴마를 넣는 것이 사람이 보기에 편하다고 느낀다니 이를 구현하려고 했는데 이미 humanize 라는 기능이 있다. settings.py 파일에 이 기능을 APP 에 추가하고 INSTALLED_APPS = [ ... 'django.contrib.humanize', 필요한 템플릿 페이지에서 로드해서 사용하면 된다. {% load humanize %} 라고 선언하고 실제 필요한 필드에 가서는 ` | intcomma ` 를 추가하면 된다. {{ item.quantity | intcomma }} 끝. 참고페이지는 아래 https://docs.djangoproject.com/en/4.0/ref/contrib/humanize/ dj..
HTML id 를 비슷하게 줘서 이벤트 처리를 하나로 하고 싶은 경우가 많다. 동일하게 주기는 찝찝하고, 뒤에 인덱스 같은거 붙여서 같은 기능을 하는 놈들을 비슷한 id로 묶어 뒀는데, 개별적으로 이벤트 처리하려니 영 맘이 안내킨다. 간단하게 JQuery 쓰면서 정규식 비스무리한 거 쓰면 해결!! 원본 글로 방문해서 보는 것을 추천 - https://m.blog.naver.com/cutesboy3/221080367471 for의 index를 부여해서 id값을 부여하여 id가 클릭시 클릭 이벤트처리하는 방법을 아래 스크립트(정규식)으로 처리 할수 있다. $("[id^='useGo_']").click(function() { // 기능 구현하기 }); 간단하게 설명을 하면 //id가 testid로 시작하는 엘..
걍 SQL 쿼리로 업데이트 하고 싶은뎅, ORM에서 제공하는 방법으로 쓰고 싶당. 그냥 변수에 넣고 save() 함수를 부르니 객체 하나씩은 되는데 쿼리셋 전체에 대해서 하는 것은 안되네. 머야 이런것도 안되....................................가 아니라 update() 함수가 따로 있다는 >>> Entry.objects.filter(id=64).update(comments_on=True) 1 >>> Entry.objects.filter(slug='nonexistent-slug').update(comments_on=True) 0 >>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False) 132 한줄로 가쟝 s..
장고 템플릿에서 전달 받은 리스트가 막상 까보니 비어 있을때를 체크해야 한다. 보통 표로 쭉 나열하는게 기본인데, 리스트가 비워져 있다면 테이블 제목만 떡 하니 나오게 되니 플래그를 따로 다시 전달해 주는 것도 방법이지만, 이미 내장 empty 라는 키워드가 있네 그냥 쓰기만 하면 되 소스 - https://docs.djangoproject.com/en/4.0/ref/templates/builtins/ {% for athlete in athlete_list %} {{ athlete.name }} {% empty %} Sorry, no athletes in this list. {% endfor %} 위의 코드처럼 for 문안에서 endfor 닫기 전에 empty 를 사용하면 된다 Pixabay 님의 사진,..
장고의 데이터 처리를 위해서 csv 내보내기를 기본 csv 라이브러리를 쓰니깐 속도가 너~~~~~~~~~~무 느려 어쩔수 없이 Pandas를 사용할 수 밖에 없네 to_csv 를 사용해서 내보내는데, 몇 초 만에 되네 ㅋㅋㅋ 한줄씩 내보내기 하니깐 몇 분 기다려도 안되던데... 암튼 내보내기 하니깐 앞에 원하지 않는 인덱스 값이 컬럼으로 들어와서 불편해서 제거하는 것을 찾아보니 떡 있네. 8-파이썬-데이터프레임의-인덱스-제거하기 정말 간단한데 to_csv 혹은 to_excel 함수를 사용하실 때 아래 코드처럼 'index=False' 만 추가하면 되거든요 👍 # file1을 인덱스 없이 '실습1_수정.xlsx'파일로 내보내기 file1.to_excel('실습1_수정.xlsx',index=False) 실제..
솔루션을 만들어도 배포해서 세상에 공개하는 것이 기술인 세상이다. 이것저것 관련 글 소스가 많지만 일단 아래 글을 참고해보자. 간단한 Django 어플리케이션 AWS에 배포하기 간단한 Django 어플리케이션 AWS에 배포하기 전통적인 방법으로 Django 어플리케이션 EC2 인스턴스에 배포하기 nearkim.coffee Gunicorn, Nginx 설치도 같이 포함되어 설명되어 있다. conf 파일 설정 방법도 물론 소개되어 있고 AWS 말고 추가로 MS Azure, Google Cloud 에도 배포하는 내용이 찾아지면 이페이지에 업데이트 하고, 제목을 바꿔야 겠다. Deehooks 님의 사진, 출처: Pexels