Django #
- django-debug-toolbar -> 디버그 내용 확인 용이
- INSTALLED_APPS “debug_toolbar”
- MIDDLEWARE “debug_toolbar.middleware.DebugToolbarMiddleware”
- INTERNAL_IPS “IP”
- djangorestframework -> restAPI 제작에 용이
- django-ninja ->
- djangorestframework의 느린 serializer 대신 pydantic 사용
- swagger 지원 POSTMAN 같은것
- Async 지원
- api version 지원
- django-seed -> db에 임시 데이터 뿌려줌
- INSTALLED_APPS “django_seed”
- cmd: python manage.py seed <app_name> --number=<num>
서버 기본 세팅 #
# 프로젝트 생성 구문
django-admin startproject <project_name>
# 프로젝프 앱 생성 구문
cd <project_name>
python <project_name>/manage.py startapp <app_name>
# 프로젝프 슈퍼 유저 생성
python <project_name>/manage.py createsuperuser
# 프로젝프 기본 마이그레이션
python <project_name>/manage.py migrate
# 프로젝프 추가 제작한 마이그레이션
# (오류발생시 setting.py -> INSTALLED_APPS에 <app_name>추가)
python <project_name>/manage.py makemigrations
# 서버 구동 구문
python <project_name>\manage.py runserver
유저 테이블 제작(models) #
커스텀 유저 테이블을 제작하는데 있어서 직접 제작이 가능하며 아래의 방법들이 있다.
- 추상화 유저 제작
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING)
setting.py에 AUTH_USER_MODEL = ‘<app_name>.Users’ 추가해야함
- 장고 모듈 활용 유저 제작
from django.contrib.auth.models import User as U
# class UserDetail(models.Model):
# user = models.OneToOneField(U, on_delete=models.CASCADE)
# pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING)
두개를 모두 사용할 경우 oneToOneField의 입력이 추상화의 Users를 가르켜야한다.
view_html #
urls.py
url 패턴을 이용하여 입력받는 주소로 부터 사용할 view단과 연결을 해준다.
from app_test.views import index, redirect_test
urlpatterns = [
path('', index , name='index'),
path('redirect', redirect_test),
]
view.py
urls.py에 연결된 view단을 세팅하는 부분
base.html과 같은경우는 <app_name>/templates 폴더에 둔다.
# 모델(DB)에서 참조할시 해당 모델 추가사항
from .models import Users
# 모델에서 유저정보를 받아서 보여지는 결과를 다르게 한 예시
def index(request):
user = Users.objects.filter(username="admin").first()
email = user.email if user else "Nooooo"
print(email)
print(request.user.is_authenticated)
if not request.user.is_authenticated:
email = "NOoooooooooooooo"
print(email)
return render(request, "base.html", {"welcome_msg": f"Hello {email}"})
# 재참조 형식의 view단 예시
def redirect_test(request):
return redirect("index")
view_restAPI #
urls.py
url 패턴을 이용하여 입력받는 주소로 부터 사용할 view단과 연결을 해준다.
<int:user_id>는 query string 사용법
urlpatterns = [
path('get_user/<int:user_id>', get_user),
]
view.py
urls.py에 연결된 view단을 세팅하는 부분
csrf_exempt는 token 인증을 임시로 풀기위한것
body가 아닌 JsonResponse는 보통 개발자들끼리 내용을 주고 받을때 사용하기도 한다.
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def get_user(request, user_id):
print(user_id)
if request.method == "GET":
abc = request.GET.get("abc")
xyz = request.GET.get("xyz")
user = Users.objects.filter(pk=user_id).first()
return render (request, "base.html", {"user": user, "params": [abc, xyz]})
elif request.method == "POST":
username = request.GET.get("username")
if username:
user = Users.objects.filter(pk=user_id).update(username=username)
return JsonResponse(status=201, data=dict(msg="POST is"))
admin_handling1 #
admin.py
admin page에서 model을 핸들링 가능하게 해준다.
from .models import PayPlan
# Register your models here.
admin.site.register(PayPlan)
django original login setting #
urls.py 세팅
- views.py
from django.contrib.auth import authenticate, login
from .forms import RegisterForm
def register(request):
if request.method == "POST":
form = RegisterForm(request.POST)
msg = "not valid data"
if form.is_valid():
form.save() # db에 저장(commit=False로 임시저장가능)
username = form.cleaned_data.get("username")
raw_password = form.cleaned_data.get("password1")
user = authenticate(username= username, password= raw_password) # 인증
login(request, user) # 로그인
msg = "login"
return render(request, "register.html", {"form": form, "msg": msg})
else:
form = RegisterForm()
return render(request, "register.html", {"form": form})
- forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import Users
class RegisterForm(UserCreationForm):
username = forms.CharField(max_length=20, required=True, help_text="name", label="이름")
email = forms.EmailField(max_length=20, required=False, help_text="email", label="이메일")
class Meta:
model = Users
fields = (
"username",
"email",
"password1",
"password2",
)
paginator #
views.py
페이지 분할 제작법
from django.core.paginator import Paginator
def a(request):
page = int(request.GET.get("page", 1))
<data> = <>.objects.all().order_by("-id") # 정렬해야 "-"내림차순
paginator = Paginator(<data>, 5)
<datas> = paginator.get_page(page)
return render(request, ".html", {"args": <datas>})
login_required #
setting.py
LOGIN_URL =”/<>”
views.py
로그인 필수 페이지 세팅
from django.contrib.auth.decorators import login_required
@login_required
def a(request):
template tags #
탬플렛을 제작하는데 있어서 조건이나 데이터 활용등을 위한 태그
- {\% csrf_token \%}
- csrf token을 필요로 하다는것을 나타낼때 사용
- {\% cycle “a” “b” \%}
- iter적인 상황에서 각 순서마다 서로 다른 영향을 주려고 할때 사용
- {\% extends “
.html" \%} - 한 html에서 다른 html을 확장하여 사용할때 사용
- 자식페이지에 최상단에 필요하며
은 부모파일이다.
- {\% block
\%} {\% endblock \%} - 한 html에서 다른 html을 확장하여 사용할때 사용
- 부모페이지에서 자식을 넣을공간에, 자식페이지에서 넣을 내용을 감싼다.
- {\% if \%}{\% elsif \%}{\% else \%}{\% endif \%}
- 조건문을 사용할때 사용
- {\% for i in items \%}{\% endfor \%}
- for문을 사용할때 사용
- forloop.counter 루프의 인덱스(1시작)
- forloop.counter0 루프의 인덱스(0시작)
- forloop.first 루프의 첫번째 True
- forloop.last 루프의 마지막 True
- for문을 사용할때 사용
- {\% includes “<filename>.html” \%}
- html에서 html 파일을 사용할때 사용할 <filename>을 작성
- extends보다 느리다.(랜더링이 느리다.)
- {\% url “<namespace>” \%}
- <namespace>로 이동하게 할때 사용
- {\% static “<filepath>” \%}
- <filepath>에 있는 static 파일 사용
- <app_name>/static/<filepath>으로 구성
- {\% load static \%}을 최상단에 작성해야함
- <filepath>에 있는 static 파일 사용
custom tags #
탬플렛을 제작하는데 있어서
- <app_name>/templatetags/custom_tags.py
from django import template
from django.utils.html import mark_safe
register = template.Library()
@register.simple_tag(name=<tag_name>, takes_context=True)
def tags_test(context): # context에는 해당 페이지 정보가 있으며 상세히 다룰 수 있다.
tag_html = "<span class='badge text-bg-primary'>태그</span>"
# mark_safe는 html로 사용해도 안전함을 알려줌 사용안하면 string으로 사용
return mark_safe(tag_html)
- {\% load custom_tags \%}
태그 사용할 html 최상단에 적용 - {{data|<tag_name>}}
태그 사용할 html 코드에 사용
custom filter #
탬플렛을 제작하는데 있어서 원하는 내용만 보여주기 위하여 사용
- <app_name>/templatetags/custom_filters.py
from django import template
register = template.Library()
@register.filter(name=<filter_name>)
def email_masker(value):
email_split = value.split("@")
return f"{email_split[0]}@******.***"
- {\% load custom_filters \%}
필터 사용할 html 최상단에 적용 - {{data|<filter_name>}}
필터 사용할 html 코드에 사용