개발하는 삶
[Django] 장고 태그 및 model.py 관련 본문
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()
'JavaScript, Vue.js, CSS > Python&Django' 카테고리의 다른 글
[Python] NumPy, OpenCV(이미지 처리), PIL (0) | 2023.01.17 |
---|---|
[Django] svg 및 함수 (0) | 2023.01.05 |
[Django] 장고 설치 및 파일 구조 파악하기 (0) | 2022.12.28 |
[Python] 힙, 자료구조 (0) | 2022.06.23 |
[Python] 숫자, 문자 변환 (0) | 2022.06.19 |