URL 별칭

  • url 매핑에서 name 속성을 사용한다.
  • url 하드코딩을 할 경우 링크 구조가 변경된다면 템플릿에서 url을 하나씩 수정해야한다.
  • html 파일 뿐 아니라 redirect에서도 사용할 수 있다.

 

(urls.py)

from django.urls import path
from . import views

urlpatterns = [
    path('<int:product_id>/', views.product_detail, name='product_detail'),
]

 

(templates-product-mall.html)

<!--URL 별칭-->
<!--shop.id는 url의 product_id에 전달되는 값-->
<a class="nav-link" style="text-align:right" href="{% url 'product_detail' shop.id  %}">
	주문하기<span class="sr-only"></span>
</a>


<!--URL 하드코딩-->
<a class="nav-link" style="text-align:right" href="/{{shop.id}}">
	주문하기<span class="sr-only"></span>
</a>

 

 

 

 

 

URL 네임스페이스

    url 별칭을 사용할 경우 타앱과 url 별칭 중복이 발생할 수 있다.

 

(urls.py)

from django.urls import path
from . import views

app_name = 'order'

urlpatterns = [
    path('<int:product_id>/', views.product_detail, name='product_detail'),
]

 

(mall.html)

<!--app_name order의 url 별칭이 product_detail-->
<!--다음과 같이 파라미터 명을 정의할 수 있다-->
<!--공백을 사용하여 여러개의 파라미터를 사용할 수 있다-->
{% url 'order:product_detail' product_id = shop.id page=2%}

 

 

'Python > Django' 카테고리의 다른 글

08. Django css  (0) 2023.04.17
07. Django from 태그  (0) 2023.04.16
05. Django 템플릿  (0) 2023.04.10
04.5 Django 관리자  (0) 2023.04.09
04.Django 모델  (0) 2023.04.09

정렬하기

    order_by( )는 정렬하는 함수이다. create_date에 - 기호가 붙어 있으면 역방향, 없으면 순방향 정렬

from django.shortcuts import render, redirect
from .models import Product

def show_list(request):
	product_list = Product.objects.order_by('-create_date')
    return redirect('/')

 

 

 

 


템플릿 설정하기

    (settings.py - TEMPLATES에 추가하기)

#app에서 공동으로 사용할 templates 폴더 생성
'DIRS': [BASE_DIR / 'templates'],

 

 

 

 

 

템플릿 태그

 

    1. 분기

{% if 조건문 %}
{% elif 조건문 %}
{% else %}
{% endif %}

 

  2. 반복

{% for i in item %}
'''
여기서 forloop 사용 가능
forloop.counter	    루프내의 순서로 1부터 표시
forloop.counter0    루프내의 순서로 0부터 표시
forloop.first	    루프의 첫번째 순서인 경우 True
forloop.last	    루프의 마지막 순서인 경우 True
'''
{% endfor %}

 

    3. 객체 출력 

{% item.id %}

 

    *템플릿 문법 참조 : https://docs.djangoproject.com/en/4.0/topics/templates/

 

 

 

 

 


디테일 페이지

 

(urls.py)

  • 로컬 ip/5 : product_id에 5가 저장된 후 product_detail 함수가 실행된다.
  • views.py에서 question_id를 사용하지 않더라도 인자로 product_id를 받아줘야 한다.
from django.urls import path
from . import views

urlpatterns = [
    path('<int:product_id>/', views.product_detail, name='product_detail'),
]

 

(views.py)

def product_detail(request, id):
	#(DB)id = id(POST에서 불러온 값)
	product = Product.objects.get(id=id)
    
	# user의 signup.html을 화면에 보여주는 함수
	# templates / product / mall.html
	return render(request, 'product/mall.html', {'product':product})

 

(mall.html)

<h1>{{ product.description }}</h1>

 

 

 

 

 

 

오류 페이지

    DoesNotExist(500) : 로컬 ip / product_id 값이 없을 때 발생하는 오류를 404 페이지로 리턴하고자 한다.

from django.shortcuts import render, get_object_or_404
from .models import Product


def product_detail(request, id):
    # pk = Primary Key(기본키)
    product = get_object_or_404(Product, pk=product_id)
    return render(request, 'product/mall.html', {'product':product})

 

 

 

 

 


Primary Key 와 Unique Key 차이

    Primary Key : 주민등록번호, 전화번호 같은 데이터를 식별하고자 할 때 사용하는 키. 테이블당 하나의 pk만 지정할 수 있으며, NULL 값을 허용하지 않는다.

    Unique Key : 아이디 중복 검사 등 유일성을 부여할 때 사용하는 키. NULL 값을 허용한다.

 

 

*제네릭뷰(Generic View) : 비슷한 패턴의 내용을 간략하게 만든 것.

'Python > Django' 카테고리의 다른 글

07. Django from 태그  (0) 2023.04.16
06. Django URL 별칭  (0) 2023.04.10
04.5 Django 관리자  (0) 2023.04.09
04.Django 모델  (0) 2023.04.09
03. Django URL  (0) 2023.04.07

관리자 계정 생성하기

 

python manage.py createsuperuser

 

 

 

모델 관리하기

    로컬 ip/admin으로 접속하면 모델이 추가된 것을 확인할 수 있다.

from django.contrib import admin
from .models import Product(모델명)

# admin 사이트에 Product 테이블 생성
admin.site.register(Product)

 

 

 

모델 검색

    아래와 같이 수정하면 관리자 페이지에 검색기능을 추가할 수 있다.

from django.contrib import admin
from .models import Product


class ProductAdmin(admin.ModelAdmin):
    search_fields = ['description']


admin.site.register(Product, ProductAdmin)

'Python > Django' 카테고리의 다른 글

06. Django URL 별칭  (0) 2023.04.10
05. Django 템플릿  (0) 2023.04.10
04.Django 모델  (0) 2023.04.09
03. Django URL  (0) 2023.04.07
02. Django 프로젝트와 앱  (0) 2023.04.05

모델

  • 클래스 모델을 생성하여 자동으로 데이터 베이스를 다루도록 한다.
  • 모델에 메서드가 추가될 때는 makemigrations와 migrate를 수행할 필요가 없다. 
  • makemigrations, migrate 는 모델의 속성이 변경되었을때 실행해야 한다.

 

(admin.py)

#모델을 admin에 등록
from django.contrib import admin
#동일한 위치의 models 파일의 UserModel을 불러옴
from .models import UserModel

# UserModel을 Admin에 추가
admin.site.register(UserModel)

 

 

(settings.py)

#가장 하단에 추가


# 기본 장고의 사용자 모델을 (user앱의 UserModel)로 변경 
AUTH_USER_MODEL = 'user.UserModel'

 

 

(models.py)

from django.db import models
from django.contrib.auth.models import AbstractUser

# models.Model : 자동생성 없이 하나씩 변수를 설정
# AbstractUser : 장고에서 제공하는 기본 유저 모델
class UserModel(AbstractUser):
    #DB 테이블의 이름을 지정해주는 정보
    #데이터베이스에 정보를 넣어주는 역할
    class Meta:
        db_table = "my_user"

    #AbstractUser 사용시 아래 내용은 입력하지 않아도 됨
    #CharField, DateTimeField 어떤 형태로 DB에 들어갈지 설정
    #username = models.CharField(max_length=20, null=False)
    #password = models.CharField(max_length=256, null=False)
    #created_at = models.DateTimeField(auto_now_add=True)
    #updated_at = models.DateTimeField(auto_now=True)
    
    
    #외래키로 UserModel을 가져오면 username이 반환
    def __str__(self):
        return self.username

 

 

 

 

Django 모델 필드의 종류

  • 문자열 : CharField, TextField
  • 날짜/시간: DateTimeField, DateField, TimeField
  • 숫자 : IntegerField, FloatField
  • 외래키 : ForeignKey

 

 

 

ForeignKey (외래키)

  • 다른 모델과 연결하기 위해 사용한다.
  • on_delete=models.CASCADE는 이 답변과 연결된 상위 데이터가 삭제될 경우 하위 데이터도 함께 삭제한다는 의미이다.

 

class Product(models.Model):
    class Meta:
        db_table = "product"
    
    username = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    description = models.TextField(max_length=256, default='')
    quantity = models.IntegerField(default=0)

 

 

 

 

makemigrations와 migrate 차이

    makemigrations : 모델을 생성하거나 모델에 변화가 있을 경우에 실행해야 하는 명령이

    migrate : DB 테이블 생성

 

 

 

 

 

장고 셸

    모델이 변경될 때마다 셸을 재시작해야 함

 

python manage.py shell

 

 

 

 

데이터 조회

 

filter와 get

 

# username에 고양이라는 문자열이 포함되어 있는지 검사
UserModel.objects.filter(username__contains='고양이')
UserModel.objects.get(id=1)

   

    filter : 조건에 해당하는 데이터를 모두 QuerySet으로 리턴한다.

          filter 사용법 참조 : https://docs.djangoproject.com/en/4.0/topics/db/queries/

    get : 유일성을 갖는 데이터(ex. id)를 조회할 때 사용한다. UserModel 객체를 리턴한다.

 

# Product 모델 id가 1인 데이터에 연결된 username을 가져오기
product = Product.objects.get(id=1)
product.username

# 반대로 UserModel에 연결된 product의 데이터를 가져올 수 있다.
user = UserModel.objects.get(id=5)
user.product(연결모델명)_set.all()

 

 

 

 

 

데이터 수정

# user id 2를 가져와 username을 고양이로 수정하고 저장하기
user_id = UserModel.objects.get(id=2)
user_id.username = '고양이'
user_id.save()

 

 

 

 

 

 

데이터 삭제

# id 4인 데이터를 삭제하기
user_id = UserModel.objects.get(id=4)
user_id.delete()

 

'Python > Django' 카테고리의 다른 글

05. Django 템플릿  (0) 2023.04.10
04.5 Django 관리자  (0) 2023.04.09
03. Django URL  (0) 2023.04.07
02. Django 프로젝트와 앱  (0) 2023.04.05
01. Django 기초  (0) 2023.04.05

urls.py

    url과 views.pyf를 연결(매핑)하는 역할

    *특별한 경우가 아니라면 url 끝에 슬래시( / ) 를 붙여야한다.

 

views.py

    웹에서 실행되는 다양한 함수 혹은 클래스가 담긴 파일

    

 

 

URL 분리

 

  • app 이라는 이름의 앱 안의 urls.py 파일에서 app과 관련된 url 처리를 할 수 있다.
  • path( ) 괄호 뒤에 쉼표( , ) 를 붙여야 에러를 방지할 수 있다.
#장고 프로젝트의 API 담당

from django.contrib import admin
from django.urls import path, include
# 내가 있는 폴더에서 views 파일을 가져옴
from . import views


urlpatterns = [
    path('admin/', admin.site.urls),
    #('로컬 ip 뒤에 /주소/ ', views.함수)
    path('', include('app.urls')),
    views.base_response, name='first_test'),
]

    *라우팅 : 경로를 누가 처리하는가?

'Python > Django' 카테고리의 다른 글

05. Django 템플릿  (0) 2023.04.10
04.5 Django 관리자  (0) 2023.04.09
04.Django 모델  (0) 2023.04.09
02. Django 프로젝트와 앱  (0) 2023.04.05
01. Django 기초  (0) 2023.04.05

+ Recent posts