(4-4) Django (2)

17701 단어 webdjangodjango

Django

데이터베이스

  • 단순히 데이터를 저장하는 창고의 개념이 아닌,
    데이터를 사용하기 쉽게 정렬해두어서 유저가 정보를 참조하고 싶을때
    쉽게 바로 사용할 수 있게 해주는 시스템
  • 대표적으로 RDB(관계형 데이터베이스)가 있음
  • SQL을 사용하여 데이터베이스 관리

장고에서는 SQL을 사용하지 않고 데이터베이스와 상호작용할 수 있는 기법이 존재

👇

ORM

객체 관계 매핑 (Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법

👉 장고에는 ORM이 내장되어 있음

Model

  • models.py

    • class <class_name>(models.Model):

      from django.db import models
      
      class Coffee(models.Model):
          # Field 1
      		# Field 2
          # ...
    • 클래스명은 데이터베이스 테이블명이다.

    • 각 필드(속성)는 데이터베이스 테이블의 컬럼이다.

**models의 필드 타입**

  • 문자열 : CharField
  • 숫자 : IntegerField, SmallIntegerField, ...
  • 논리형 : BooleanField
  • 시간/날짜 : DataTimeField
  • ...

👉 각 필드에 옵션을 인자로 주어 기본사항이나 제약사항을 추가할 수 있음

  • models.py

    from django.db import models
    
    class Coffee(models.Model):
        name = models.CharField(default="", max_length=30)
        price = models.IntegerField(default=0)
        is_ice = models.BooleanField(default=False)

Admin 페이지에서 Model 관리하기

  • admin.py

    • 장고가 기본적으로 제공하는 관리자 App

    • (이전 내용에서) superuser 계정을 이용하여 접근할 수 있었음

      from django.contrib import admin
      from .models import Coffee
      
      admin.site.register(Coffee)

      👉 admin 페이지에서 model들을 관리할 수 있음

      admin 페이지 접속전에 마이그레이션 진행!

      # 변경사항 확인
      python manage.py makemigrations
      
      # 변경사항 적용
      python manage.py migrate

    • Coffee object로 표시되어 보기 불편함

    • → admin의 각 객체의 표시 내용은 models.py 에서 str 메소드로 지정 가능

    • models.py

      class Coffee(models.Model):
          name = models.CharField(default="", max_length=30)
          price = models.IntegerField(default=0)
          is_ice = models.BooleanField(default=False)
      
          def __str__(self):
              return self.name

Template 상에서 Model 보여주기

  • views.py

    ...
    
    def coffee_view(request):
        coffee_all = Coffee.objects.all()  # get(), fileter(), ...
        return render(request, 'coffee.html', {'coffee_list': coffee_all})
  • urls.py

    urlpatterns = [
        ...
        path('coffee/', coffee_view),  # 127.0.0.1/coffee
    ]
  • coffee.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Coffee List</title>
    </head>
    <body>
        <h1>My Coffee List</h1>
    
        {% for coffee in coffee_list %}
        <p>{{ coffee.name }}, {{ coffee.price }}</p>
    
        {% endfor %}
    </body>
    </html>

Template 상에서 Model 내용 변경하기 - Form 이용

  • forms.py

    • class <class_name>(forms.ModelForm):

      from django.db import models
      
      class CoffeeForm(forms.Model.Form):
          class Meta:
              model = Coffee
              fields = ('name', 'price', 'is_ice')
    • Meta class

      • model : 모델명
      • fields : 가져올 필드를 지정
  • views.py

    from .forms import CoffeeForm
    
    def coffee_view(request):
        coffee_all = Coffee.objects.all()  # get(), fileter(), ...
        form = CoffeeForm()
        return render(request, 'coffee.html', {'coffee_list': coffee_all, 'coffee_form': form})
  • coffee.html

    ...
    <body>
        ...
        <form method="POST">{% csrf_token %}
            {{ coffee_form.as_p }}
    
            <button type="submit">Save</button>
        </form>
    
    ...

    💡 form 안에는 반드시 CSRF token을 추가해주어야 함!

이제 해당 정보를 받아서 DB에 저장하는 코드 작성!

  • views.py

    def coffee_view(request):
        coffee_all = Coffee.objects.all()  # get(), fileter(), ...
    
        # 만약 request가 POST라면:
        # POST를 바탕으로 Form을 완성하고
        # Form이 유효하면 -> 저장!
        if request.method == "POST":
            form = CoffeeForm(request.POST)     # 내용이 채워진 완성된 Form
            if form.is_valid():                 # 채워진 Form이 유효하다면:
                form.save()                     # Form 내용을 Model에 저장
    
        form = CoffeeForm()
        return render(request, 'coffee.html', {'coffee_list': coffee_all, 'coffee_form': form})

좋은 웹페이지 즐겨찾기