개발하는 삶

[Django] 장고 태그 및 model.py 관련 본문

JavaScript, Vue.js, CSS/Python&Django

[Django] 장고 태그 및 model.py 관련

삶_ 2023. 1. 2. 20:25

 

staticfiles

  • python manage.py collectstatic
  • 프로젝트 안의 모든 static 파일들을 한군데로 모아줌
  • STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    • staticfiles 폴더라는 이름으로 모으라는 뜻
  •  static 폴더 위치
// 맨 상위 폴더 아래에 존재하는 static 이라는 폴더에 모아주기
STATICFILES_DIRS = [
    BASE_DIR / "static"
]

 

 

{%%}

  • {% extends ‘index.html’ %} : 해당 파일(index.html)에 현재 파일을 내보냄
  • {% include ‘index.html’ %} : 해당 파일을 포함함
    • with 변수=변수값 (변수를 포함하기)
  • {% block content %} : block 블럭명 하면 그 밑에 추가할 블럭 입력하면 됨
  • {% block css %} : 이 영역에 css 파일을 연결한다는 의미
  • {% endblock %} : {% block %} 끝나는 문장
  • {% load static %} : static 폴더 불러오기
  • {%%} 안에 적힌 코드를 템플릿 언어라고 함. html 내에서 쓸 수 있는 장고의 언어.(파이썬 언어)
    • {% for feed in feeds %}
    • <p>{{feed.content}}</p>
    • {% endfor %}
  • 예시
    • <link rel="stylesheet" href="{% static 'css/index.css' %}" />
    • static 폴더 아래의 css 폴더 아래의 index.css 파일을 의미
  •  {% csrf_token %}
    • 웹 해킹, 웹사이트의 취약점을 공격하는 것을 막아줌
    • post 요청에서만 <form> 태그 안에 csrk token을 발급하고 체크함
  • {% url ‘url명’ %}
    • url 링크 만들어주는 태그
// 만약 아래와 같은 경우,
<li><a href="{% url 'lala:search' %}">랄랄</a></li>

// jproject/urls.py
// include() : lala/ 로 시작하는 모든 url은 lalaapp 안의 urls.py 에서 관리된다
urlpatterns = [
    path('lala/', include('lalaapp.urls', namespace='lala')),
]

// lalaapp/urls.py
urlpatterns = [
    path('search/', MSearch.as_view(), name='search')
]

 

 

 

 

is_authenticated

  • 로그인 여부 묻기
  • {% if user.is_authenticated %} {% endif %}

 

 

is_superuser

  • 장고 내 권한 옵션.
  • 관리자 페이지 내용을 제한 없이 볼 수 있다.
  • {% if user.is_superuser %} {% endif %}

 

 

 

models 값 불러오기

  • from .models import 변수명
    • 변수명.objects.all() : 오브젝트값 전체 불러오기
    • 변수명.objects.all().order_by(’필드값’) : 필드값을 기준으로 정렬함
    • 변수명.objects.all().order_by(’-필드값’) : 필드값을 기준으로 역정렬함
    • 변수명.objects.value() : 필드의 값들 전체 가져오기
    • 변수명.objects.value('값', '값2', ...) : 값에 해당하는 키와 키의 값 모두 가져오기

 

 

팝업창 vs 모달창

  • 팝업창 : 홈페이지 밖에 창이 뜸
  • 모달창 : 홈페이지 배경부분 어둡게, 그리고 홈페이지 내의 창이 뜨는 것

 

 

decorator

  • 복잡한 코드가 여러 함수에 중복적으로 들어갈 경우 단순화 해주는 함수

 

 

redirect / render

  • 둘은 페이지를 새로고침 해주는 역할을 한다.
  • redirect : html 파일 외 url 경로를 기준으로 페이지를 로드하며, 다른 데이터와 함께 보낼 수 없음.
    • render redirect(’/’)
  • render : 특정 html 파일을 불러오고, 파라미터에 데이터를 담아 보낼 수 있음.
    • return render(request, ‘index.html’, context=view.py에서 사용하는 파이썬 변수)
    • request : 요청의 의미
    • index.html : 템플릿
    • context='값' : 템플릿에 전달할 데이터를 딕셔너리로 전달함
      • 딕셔너리 안의 key는 템플릿 파일에서 사용할 템플릿 변수명이 됨.

 

 

파이썬의 데이터 모델

  • 파이썬은 데이터를 추상화한 객체의 모임이다.
  • 그 객체는 아이덴티티, 값, 타입을 필요로 함.
    • 아이덴티티 : 객체의 수명 기간에 유일한 값으로 존재함.
    • 값 : 객체의 값
    • 타입 : 객체가 지원하는 연산 및 특성 정의 (숫자면 숫자에 관련된)

 

 

장고 모델 - Meta 클래스

  • 클래스 안에 Meta 클래스를 사용해 모델의 metadata 를 부여함
    • metadata : 데이터의 집합. 다른 데이터에 대한 정보 제공
    • 장고의 모델에 취급하는 방법을 변경함
  • 옵션
    • ordering = [’필드값’] : 필드값으로 정렬하기
    • db_table = ‘db테이블명’ : 모델에 사용할 db테이블명
    • verbose_name = ‘개별모델명’ : 개별모델명을 지정
    • verbose_name_plural = ‘복수모델명’ : 모델의 복수명을 지정
    • managed = False : False 라면 makemigrations로 migrations 파일 생성시 테이블을 생성하지 않음.
    • unique_together = ['driver', 'restaurant'] : 함께 고려할 때 합쳐서 고유해야하는 필드 목록.

 

테이블클래스명.objects.메서드

  • all() : 해당 테이블의 모든 필드들을 반환
  • filter() : 지정 조건에 해당하는 필드들을 반환
    • filter(필드명1=테이블명.objects.values(’필드명’))
  • exclude() : 지정 조건에 해당하지 않는 필드들을 반환
  • get() : 지정한 조건에 해당하는 필드 하나를 반환
    • 한 개 이상일 경우 예외 발생
  • save() : 기존의 객체를 수정. 오버라이딩이 가능해 활용도 높음
    • orm으로 비유했을 때, 쿼리를 만들어도 실행까지는 안됨
    • 실행할 수 있도록 메서드 save() 를 붙여줘야 진짜 DB까지 저장이 가능.
  • create() : 지정한 필드값으로 필드 생성 후 반환
    • 새로운 객체를 생성 및 DB에 저장
    • 모델 클래스에 내장된 메서드(이미 정의된 메서드)라 오버라이딩이 불가능
    • orm으로 비유했을 때, 쿼리를 만들어 바로 DB 저장까지 가능
  • update() : 지정한 조건에 해당하는 필드 업데이트
    • update(title=3) : title을 3으로 업데이트
  • delete() : 지정한 조건에 해당하는 필드 삭제

 

오버라이딩 가능한 메서드

  • save(), delete()
  • 함수 상속받아서 만들기
  • ModelAdmin 활용

 

예시들

 

filter 로 모델 값 가져오기

# filter는 해당하는 조건에 맞게 쿼리를 불러옴
모델클래스명.objects.filter(id=self.id).update(
      ....
  )

 

save()

# save() 메서드 오버라이딩
# 테이블1에 데이터 추가시 -> 테이블2에도 해당 데이터를 추가
class Table1(models.Model):
    # fields here
    
    def save(self, *args, **kwargs):
        # self.pk = primary key(고유키)를 의미
        # DB가 처음 생성될때 생기므로 기존에 존재하는 데이터인지 확인이 가능
        created = not self.pk # 처음 생성되었는지 확인
        super(Table1클래스명, self).save(*args, **kwargs)
        if created: # 새로 생성된 데이터라면
            Table2.objects.create(Table1클래스명=self)
            
# 테이블2에도 테이블1에서 추가한 것을 생성
혹은,

    def save(self, *args, **kwargs):
        # 새로 생성한 데이터를 테이블1에 저장
        super(Table1클래스명, self).save(*args, **kwargs)
        # create() : save() 안해도 생성 및 즉시 DB에 저장됨
        # 해당 컬럼에 새로 생성한 데이터 값을 동시에 저장해 줌
        Table2.objects.create(Table1의 컬럼명=self.테이블2의 컬럼명)

 

get() 으로 특정 행 갖고오기

# id가 해당 함수 내의 모델클래스 id 와 같을 경우, 특정 행 갖고오기
행담는변수 = 갖고올모델클래스명.objects.get(id=self.id)

 

admin 커스터마이징

# delete 메서드 오버라이딩 (save()와 비슷)
def delete(self, *args, **kwargs):
    # super(table1, self) => table1 모델 객체의 부모 클래스인 models.Model을 의미. 이렇게 하면 table1에서도 models.Model 메서드 사용 가능
    super(table1, self).delete(*args, **kwargs)
    table2.objects.filter(id=self.id).delete()