5. sqlite

6. where, group by

7. 원격 DB

8. DB - ForeignKey

9. DB - CRUD, 페이징

10. 게시판


5. sqlite

: 장고의 ORM(Object Relational Mapping) 사용하여 내장 함수로 DB의 DML, DDL .. 등을 실행.

 

 = django_test04_sqlite

 * settings

INSTALLED_APPS = [
	...
    'sqlapp',
]

 

 * url

from django.contrib import admin
from django.urls import path
from sqlapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.Main),
    path('show/', views.DbTestFunc),
]

path('admin/', admin.site.urls) : admin 요청명 admin.py와 연결

 

 * models : db table 작성

from django.db import models

# Create your models here.
# ORM
# 논리적인 테이블 설정
class Article(models.Model):
    code = models.CharField(max_length=10)
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    pub_date = models.DateTimeField()

class 테이블명(models.Model) : 테이블 생성

column명 = models.CharField(maxlength= ) : 문자타입 칼럼 생성.

column명 = models.IntegerField() : 숫자타입 칼럼 생성.

column명 = models.DateTimeField() : 날짜타입 칼럼 생성.

 

explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - sqlapp

explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate

 

 

 * admin계정 id 생성
 - anconda prompt 창 실행

cd C:\work\psou\django_test04_sqlite
python manage.py createsuperuser
=> id / e-mail / password 설정

 - http://127.0.0.1/admin/ 접속 후 login

 - table data 입력

 

 

 * admin

from django.contrib import admin
from sqlapp.models import Article

# Register your models here.
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'code', 'name', 'price', 'pub_date')

admin.site.register(Article, ArticleAdmin)

class 클래스명(admin.ModelAdmin):

     list_display = ('칼럼명1', ... )

admin.site.register(테이블명, 클래스명)

 => 테이블과 admin계정 연결

 

 

 * views

from django.shortcuts import render
from sqlapp.models import Article

# Create your views here.
def Main(request):
    return render(request, "main.html")

def DbTestFunc(request):
    datas = Article.objects.all() # 장고의 ORM. select * from Article 이 내부적으로 수행. list 타입으로 리턴.
    #print(datas) # <QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
    #print(datas[0].name) # 아아
    return render(request, 'list.html',{'articles':datas}) # QuerySet을 전달.

models.py의 클래스명.objects.all() : select * from 테이블명(클래스명)

 

 

 * main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="show/">자료 보기</a>
</body>
</html>

 

 * list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


Article 자료 보기 - Djang template language 사용 <br>
{% if articles.count %}
	{% for a in articles %}
		<b>{{a.code}}</b> {{a.name}} {{a.price}} {{a.pub_date}}<br>
	{% endfor %}
{% else %}
	<p>자료가 없습니다.</p>
{% endif %}
</body>
</html>

{% if 조건 %}

{% else %}

{% endif %}

=> if 문

 

{% for 변수 in 자료 %}

{% endfor %}

=> for 문

 

6. where, group by

 * settings

INSTALLED_APPS = [
    ...
    'sql_app',
]

 => application연결

 

 

 * models

from django.db import models

# Create your models here.
class Profile(models.Model):
    name = models.CharField(max_length = 10)
    age = models.IntegerField()
    

 => DB 테이블 생성

 

 - explore 창 - 프로젝트 오른쪽 클릭 - Django - Create application - sqlapp

 - explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - sqlapp

 - explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate

 

해당 프로젝트 cmd 창 : python manage.py createsuperuser 

 

 * admin

from django.contrib import admin
from sql_app.models import Profile

# Register your models here.
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'age')

admin.site.register(Profile, ProfileAdmin)

 => 테이블과 admin 계정 연결.

 

 - http://127.0.0.1/admin/ 접속 후 login

 - table data 입력

 

 

 * urls

from django.contrib import admin
from django.urls import path
from sql_app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.IndexFunc),
    path('calldata/', views.CallFunc),
]

 => url과 views 연결

 

 

 * views

from django.shortcuts import render
from sql_app.models import Profile
from django.db.models.aggregates import Avg, Count, Max, Min, Sum

# Create your views here.
def IndexFunc(request):
    return render(request, 'index.html')

def CallFunc(request):
    profile_list = Profile.objects.all() # 전체 자료 list로 리턴
    
    for row in profile_list.values_list(): # 리스트의 값들 리턴
        print(row)
        
    print(Profile.objects.aggregate(Avg('age')))  # select avg(age) from Profile
    print(Profile.objects.aggregate(Max('age')))
    print(Profile.objects.aggregate(Sum('age')))
    print(Profile.objects.aggregate(Count('age')))
    print(len(profile_list))
    print(Profile.objects.filter(name = '홍길동').aggregate(Avg('age'))) # where 조건
    qs = Profile.objects.values('name').annotate(Avg('age')) # group 별 작업
    
    for r in qs:
        print(r)
        
    pro_list = []
    
    for pro in profile_list:
        pro_dict ={}
        pro_dict['name'] = pro.name
        pro_dict['age'] = pro.age
        pro_list.append(pro_dict)
        print(pro_list)
        # [{'key1':value1, 'key2':value2, ... }, {'key1':value1, 'key2':value2, ... }, ... ]
    
    context = {'pro_list':pro_list}
        
    return render(request, 'list.html', context)

QuerySet 타입.values_list() : value list 리턴

테이블명.objects.aggregate(Avg('칼럼명')) : select avg(칼럼명) from 테이블명

테이블명.objects.aggregate(Max('칼럼명')) : select max(칼럼명) from 테이블명

테이블명.objects.aggregate(Sum('칼럼명')) : select sum(칼럼명) from 테이블명

테이블명.objects.aggregate(Count('칼럼명')) : select count(칼럼명) from 테이블명

테이블명.objects.filter(칼럼명=값) : select * from 테이블명 where 칼럼명 = 값

테이블명.objects.values('칼럼명').annotate(Avg('칼럼명')) : select avg(칼럼명) from 테이블명 group by 칼럼명

 

 

 * index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
메인(QuerySet Test)<br>
<a href="calldata/">db 자료를 읽어 dict type으로 출력</a>
<br>
<a href="admin/">장고가 지원하는 관리자 창</a>
</body>
</html>

 

 

 

 * list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
자료 보기</p>
{{pro_list}}
</body>
</html>

7. 원격 DB

 = django_test06_mariadb

DB 접속하여 DataBase 생성

explore 창 - 프로젝트 오른쪽 클릭 - Django - Create application - myguset

 

 

 * settings

INSTALLED_APPS = [

    ...
    
    'myguest',
]

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'yourdb',                     # DB명 : db는 미리 작성되어 있어야 함.       
        'USER': 'root',                       # 계정명 
        'PASSWORD': '123',                    # 계정 암호           
        'HOST': '127.0.0.1',                  # DB가 설치된 컴의 ip          
        'PORT': '3306',                       # DBMS의 port 번호     
    }
}

DATABASES = {
    'default': {

        django.db.backends.mysql',

        'NAME': 'database명',                     # DB명 : db는 미리 작성되어 있어야 함.       
        'USER': 'root',                          # 계정명 
        'PASSWORD': '123',                  # 계정 암호           
        'HOST': '127.0.0.1',                   # DB가 설치된 pc의 ip          
        'PORT': '3306',                        # DBMS의 port 번호     
    }
}

 => remote DB 연결 정보.

 

 

 * models

from django.db import models

# Create your models here.
class Guest(models.Model):
    myno = models.AutoField(auto_created = True, primary_key = True)
    title = models.CharField(max_length=50)
    content = models.TextField()
    regdate = models.DateTimeField()
    
    def __str__(self):
        return self.title
    
    class Meta:
        ordering = ('-title', 'id') # title이 같으면 id로 정렬
        ordering = ('-id',) # tuple 타입만 가능. 

칼럼명 = models.AutoField(auto_created = True, primary_key = True) : 자동 증가하는 index 기본키 생성.

칼럼명 = models.TextField() : text타입 칼럼 생성

 

class Meta:

ordering = ('-칼럼명1', '칼럼명2')

 => 칼럼명1 기준 desc 정렬 후 데이터가 같은 정보에 대해 칼럼명2 기준 asc정렬.

 

 

 - explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - myguset

 - explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate

 

 

 * admin

from django.contrib import admin
from myguest.models import Guest

# Register your models here.
class GuestAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'content', 'regdate')

admin.site.register(Guest, GuestAdmin)

 => 테이블과 admin계정 연결.

 

 

 * admin계정 id 생성 및 table data 입력

 

 

 * urls(django_test06_mariadb)

from django.contrib import admin
from django.urls import path
from myguest import views
from django.urls.conf import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.MainFunc),
    path('guest/', include("myguest.urls")),
]

 => url과 views 연결

 

 

 * urls(myguest)

from django.urls import path
from myguest import views

urlpatterns = [
    path('', views.ListFunc),
    path('insert', views.InsertFunc),
    path('insertok/', views.InsertOkFunc),
]

 => url과 views 연결

 

 

 * views

from django.shortcuts import render
from myguest.models import Guest
from datetime import datetime
from django.http.response import HttpResponseRedirect

# Create your views here.
def MainFunc(request):
    return render(request, 'main.html')

def ListFunc(request):
    gdata = Guest.objects.all()                       # 전체 자료 읽기
    gdata = Guest.objects.all().order_by('title')    # order_by ascending
    gdata = Guest.objects.all().order_by('-title')   # order_by descending
    gdata = Guest.objects.all().order_by('-id')[0:2] # 정렬 후 슬라이싱
    print('gdata type : ', type(gdata))               # <class 'django.db.models.query.QuerySet'>
    return render(request, 'list.html', {'gdatas' : gdata})

def InsertFunc(request):
    return render(request, 'insert.html')

def InsertOkFunc(request):
    if request.method =='POST':
        print(request.POST.get('title'))
        print(request.POST['title'])
        # 입력자료로 테이블에 저장 : ORM
        Guest(
            title = request.POST.get('title'),
            content = request.POST.get('content'),
            regdate = datetime.now()
        ).save()
    return HttpResponseRedirect('/guest') # 추가후 목록 보기
'''
# 수정
g = Guest.objects.get(id=1)
g.title = "하하"
g.content = '하하하'
g.save()

# 삭제
g = Guest.objects.get(id=1)
g.delete
'''

테이블명.objects.all().order_by('칼럼명') : order by 칼럼명 asc

테이블명.objects.all().order_by('-칼럼명') : order by 칼럼명 desc

 

 - insert

테이블명(

    변수명 = request.POST.get('칼럼명'),

     ...

    변수명 = datetime.now()

).save()

 

 - update

temp = 테이블명.objects.get(조건)

temp.칼럼명 = "수정값"

temp.save()

 

 - delete

temp = 테이블명.objects.get(조건)

temp.delete()

 

 

 * main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="guest/">미니 방명록 보기</a>
</body>
</html>

 

 * list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>글 목록</h2>

<a href="/guest/insert">자료 추가</a>
<table border="1">
	<tr>
		<th>아이디</th><th>제목</th><th>내용</th><th>등록일</th>
	</tr>
	{% if gdatas %}
	{% for g in gdatas %}
	<tr>
		<td>{{g.id}}</td>
		<td>{{g.title}}</td>
		<td>{{g.content}}</td>
		<td>{{g.regdate}}</td>
	</tr> 
	{% endfor %}
	{% else %}
	<tr>
		<td colspan ="4">자료가 없습니다.</td>
	</tr>
	{% endif %}
</table>
</body>
</html>

 

 * insert.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>방명록 글 입력</h2>
<form action="/guest/insertok/" method="post">{% csrf_token %}
<table>
	<tr>
		<td>제목</td>
		<td><input type="text" name="title" size="48"/></td>
	</tr>
	<tr>
		<td>내용</td>
		<td><textarea rows="5" cols="50" name="content"></textarea></td>
	</tr>
	<tr>
		<td colspan="2" style="text-align: center;"><input type="submit" value="등록" /></td>
	</tr>

</table>
</form>
</body>
</html>

8. DB - ForeignKey

 = django_test07

Django - create application - sangpumapp

 

 * settings

INSTALLED_APPS = [
    ...
    'sangpumapp',
]

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'sanpumdb',            # DB명 : db는 미리 작성되어 있어야 함.       
        'USER': 'root',                # 계정명 
        'PASSWORD': '123',             # 계정 암호           
        'HOST': '127.0.0.1',           # DB가 설치된 컴의 ip          
        'PORT': '3306',                # DBMS의 port 번호     
    }
}

 => application 연결 및 dataBase 연결 설정.

 

 

 * models

from django.db import models

# Create your models here.
class Maker(models.Model):
    mname = models.CharField(max_length=10)
    tel = models.CharField(max_length=20)
    addr = models.CharField(max_length=50)
    
    class Meta:
        ordering = ('-id',)
        
    def __str__(self):
        return self.mname
    
class Product(models.Model):
    pname = models.CharField(max_length=50)
    price = models.IntegerField()
    maker_name = models.ForeignKey(Maker, on_delete = models.CASCADE) # Maker table의 id와 연결

칼럼명 = models.ForeignKey(연결할 테이블명, on_delete = models.CASCADE) : 다른 테이블의 id를 Foreign Key로 사용

 

 

Django - make migrations - sangpumapp

Django - migrate

 

anaconda 접속 - cd C:\work\psou\django_test07 - python manage.py createsuperuser

 

 * admin

from django.contrib import admin
from sangpumapp.models import Maker, Product

# Register your models here.
class MakerAdmin(admin.ModelAdmin):
    list_display =('id', 'mname', 'tel', 'addr')
admin.site.register(Maker, MakerAdmin)

class ProductAdmin(admin.ModelAdmin):
    list_display =('id', 'pname', 'price', 'maker_name')
admin.site.register(Product, ProductAdmin)

 => 테이블에 admin 계정 연결.

 

http://127.0.0.1/admin/ 접속

Maker/Product table에 data 추가

 

 * urls

from django.contrib import admin
from django.urls import path
from sangpumapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    
    path('', views.Main),
    path('list1', views.List1), # maker
    path('list2', views.List2), # product
    path('list3', views.List3), # list1 -> list2
]

 => url과 views 연결.

 

 

 * views

from django.shortcuts import render
from sangpumapp.models import Maker, Product

# Create your views here.
def Main(request):
    return render(request, 'main.html')
    
def List1(request):
    makers = Maker.objects.all() # select
    return render(request, 'list1.html', {'makers':makers})
    
def List2(request):
    products = Product.objects.all() # select
    pcount = len(products)
    return render(request, 'list2.html', {'products':products, 'pcount':pcount})
    
def List3(request):
    mid = request.GET.get("id")
    products = Product.objects.all().filter(maker_name = mid)
    pcount = len(products)
    return render(request, 'list2.html',{'products':products, 'pcount':pcount})

변수1 = request.GET.get("key값")

테이블1.objects.all().filter(칼럼1 = 변수1) : 테이블1의 칼럼1에서 key의 value와 동일값의 list 출력.

 

 

 * main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인화면</h2>
<ul>
	<li><a href="list1">상품 제조사 보기</a></li>
	<li><a href="list2">상품 목록 보기</a></li>
	<li>묻고 답하기</li>
</ul>
</body>
</html>

 * list1.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>제조사 목록</h2>
	<table border="1">
		<tr>
			<th>아이디</th><th>제조사</th><th>전화번호</th><th>주소</th>
		</tr>
		{% if makers %}
		{% for m in makers %}
		<tr>
			<td>{{m.id}}</td>
			<td><a href="list3?id={{m.id}}">{{m.mname}}</a></td>
			<td>{{m.tel}}</td>
			<td>{{m.addr}}</td>
		</tr>
		{% endfor %}
		{% else %}
		<tr>
			<td colspan="4">자료가 없습니다.</td>
		</tr>
		{% endif %}
	</table>
</body>
</html>

 

 * list2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>상품 목록</h2>
	<table border="1">
		<tr>
			<th>아이디</th><th>상품명</th><th>가격</th><th>제조사</th>
		</tr>
		{% if products %}
		{% for p in products %}
		<tr>
			<td>{{p.id}}</td>
			<td>{{p.pname}}</td>
			<td>{{p.price}}</td>
			<td>{{p.maker_name}}</td>
		</tr>
		{% endfor %}
		<tr>
			<td colspan="4">건수{{pcount}}</td>
		<tr>
		{% else %}
		<tr>
			<td colspan="4">자료가 없습니다.</td>
		</tr>
		{% endif %}
	</table>
</body>
</html>


9. DB - CRUD, 페이징

① 메인 페이지

 = django_test08_sangdata

 * settings

...

INSTALLED_APPS = [

    ...
    
    'mysangpum',
]

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'test',                # DB명 : db는 미리 작성되어 있어야 함.       
        'USER': 'root',                # 계정명 
        'PASSWORD': '123',             # 계정 암호           
        'HOST': '127.0.0.1',           # DB가 설치된 컴의 ip          
        'PORT': '3306',                # DBMS의 port 번호     
    }
}

...

TIME_ZONE = 'Asia/Seoul'
USE_TZ = False

TIME_ZONE = 'Asia/Seoul'
USE_TZ = False

 => admin 페이지에 표시되는 시간은 기본적으로 UTC(UTC+9)이므로, 입력을 해도 9시간 전으로 표시된다.
      이에 표시되는 시간과 실제 DB에 입력되는 시간을 모두 Local시간(UTC)으로 맞춰 주어야 한다

 

 

 * remote DB의 데이터를 Django 형식으로 불러오기

anconda 접속

cd C:\work\psou\django_test08_sangdata
python manage.py inspectdb > abc.py

 => 이미 생성되어 있는 DB를 django 형식으로 abc.py에 코드 자동 작성.

 

 

 * models

from django.db import models

# Create your models here.
class Sangdata(models.Model):
    code = models.IntegerField(primary_key=True)
    sang = models.CharField(max_length=20, blank=True, null=True)
    su = models.IntegerField(blank=True, null=True)
    dan = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sangdata'

 => abc.py의 sangdata table 내용 입력

 

 

 - Django - Make migrations - mysangpum

 - Django - Migrate

 

 

 * urls(django_test08_sangdata)

from django.contrib import admin
from django.urls import path
from mysangpum import views
from django.urls.conf import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.MainFunc),
    path('sangpum/', include('mysangpum.urls')), # 요청 위임
]

 => url과 views 연결.

 

 

 * views

def MainFunc(request):
    return render(request, 'main.html')

 

 

 * main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="sangpum/list">상품보기(MariaDB)</a>
</body>
</html>

 

 

② list 출력

 

 * urls(mysangpum)

from django.urls import path
from mysangpum import views

urlpatterns = [
    path('list', views.ListFunc),
    path('insert', views.InsertFunc),
    path('insertok', views.InsertokFunc),
    path('update', views.UpdateFunc),
    path('updateok', views.UpdateokFunc),
    path('delete', views.DeleteFunc),
]

 => url, views 연결

 

 

 * views

def ListFunc(request):
    
    #SQL 직접사용해 보기
    conn = MySQLdb.connect(**config)
    sql = 'select * from sangdata'
    cursor = conn.cursor()
    cursor.execute(sql)
    datas = cursor.fetchall()
    print(type(datas)) # tuple
    
    
    # Django ORM
    datas = Sangdata.objects.all()
    return render(request, 'list.html', {'sangpums':datas})
    
    ...

 

 

* list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>상품자료</h2>
<div style="width:80%; text-align:right;">
	<a href="/sangpum/insert">상품 추가</a>
</div>
<table class="table" style="width:80%;">
	<tr>
		<th>code</th><th>상품</th><th>수량</th><th>단가</th><th>기타</th>
	</tr>
	{% if sangpums %}
	{% for s in sangpums%}
	<tr>
		<!-- <td>{{s.0}}</td> -->
		<td>{{s.code}}</td>
		<td>{{s.sang}}</td>
		<td>{{s.su}}</td>
		<td>{{s.dan}}</td>
		<td>
			<a href="/sangpum/update?code={{s.code}}">수정</a> /
			<a href="/sangpum/delete?code={{s.code}}">삭제</a>
			</td>
	</tr>
	{% endfor%}
	{% else %}
	<tr>
		<td colspan="5">자료가 없습니다.</td>
	</tr>
	{% endif%}
</table>
</body>
</html>

 

 

③ 페이징 처리

 

 * views

def ListFunc(request):
    ...
    # 페이지 나누기 처리 - Paginator 클래스
    datas = Sangdata.objects.all().order_by('-code') # order by code desc
    paginator = Paginator(datas, 3) # 페이지당 출력 행수를 생성자로 전달
    try:
        page = request.GET.get('page') # page 값을 read
    except:
        page = 1 # page 값이 없을 경우 1 page 출력
    
    try:
        data = paginator.page(page)
    except PageNotAnInteger: # page가 숫자가 아닐 경우
        data = paginator.page(1)
    except EmptyPage:
        data = paginator.page(paginator.num_pages()) # 현재 페이지 출력
    
    # 클라이언트 화면에 개별 페이지 번호 표시용
    allPage = range(paginator.num_pages + 1)
    #print('allPage : ', allPage) # range(0, 5)
    return render(request, 'list2.html', {'sangpums':data, 'allPage':allPage}) 

paginator = Paginator(데이터, 출력행수) : 객체 생성. 페이지당 출력 행수를 생성자로 전달

paginator.page(출력페이지) : 나눠진 페이지에서 출력할 페이지 입력.

paginator.num_pages : 총페이지 수

 

* list2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
	function func(){
		//alert("aa");
		let result = confirm("정말 삭제 할까요?")
		if(result){
			frm.submit();
		}
	}
</script>
</head>
<body>
<h2>상품자료</h2>
<div style="width:80%; text-align:right;">
	<a href="/sangpum/insert">상품 추가</a>
</div>
<table class="table" style="width:80%;">
	<tr>
		<th>code</th><th>상품</th><th>수량</th><th>단가</th><th>기타</th>
	</tr>
	{% if sangpums %}
	{% for s in sangpums%}
	<tr>
		<!-- <td>{{s.0}}</td> -->
		<td>{{s.code}}</td>
		<td>{{s.sang}}</td>
		<td>{{s.su}}</td>
		<td>{{s.dan}}</td>
		<td>
			<a href="/sangpum/update?code={{s.code}}">수정</a> /
			<!-- 삭제 전에 묻는 작업이 필요 -->
			<form action="/sangpum/delete" name="frm" method="get" style="display:inline;">
				<input type="hidden" name="code" value="{{s.code}}">
				<a href="javascript:void(0); onclick=func()">삭제</a>
			</form>
			</td>
	</tr>
	{% endfor%}
	<!-- paging -->
	<tr>
		<td colspan="5">
		{% if sangpums.paginator.num_pages > 1 %}
			<ul class="pager">
				{% if sangpums.has_previous %}
					<li class="previous"><a href="/sangpum/list?page={{sangpums.previous_page_number}}">Previous</a></li>
					<!-- <li><a href="/sangpum/list?page={{sangpums.previous_page_number}}">&laquo;이전</a></li> -->
				{% endif %}
				
				{% if sangpums.has_next %}
					<li class="next"><a href="/sangpum/list?page={{sangpums.next_page_number}}">Next</a></li>
					<!-- <li><a href="/sangpum/list?page={{sangpums.next_page_number}}">다음&raquo;</a></li> -->
				{% endif %}
				&nbsp; &nbsp;
				<li>(페이지 : {{sangpums.number}} / {{sangpums.paginator.num_pages}})</li>
			</ul>
			<hr>
			
			{% for p in allPage%}
				{% if p > 0 %}
					{% if p == sangpums.number %}
						[{{p}}]
					{% elif p != sangpums.number %}
						<a href="/sangpum/list?page={{p}}]"> {{p}} </a>
					{% endif %}
				{% endif %}
			{% endfor%}
		{% endif %}
		</td>
	</tr>
	{% else %}
	<tr>
		<td colspan="5">자료가 없습니다.</td>
	</tr>
	{% endif%}
</table>
</body>
</html>

data.number : 현재페이지

data.paginator.num_pages : 총 페이지

 

④ 게시물 추가

 * views

def InsertFunc(request):
    return render(request, 'insert.html')

def InsertokFunc(request):
    if request.method == 'POST':
        code = request.POST.get("code")
        #print('code : ', code)
        # 새로운 상품 code 유무 검증 작업 후 insert 진행
        try:
            Sangdata.objects.get(code=code) # where
            #print('code 있음')
            return render(request, 'insert.html', {'msg':'이미 등록된 번호입니다.'})
        except Exception as e:
            #print('code 없음')
            Sangdata(
                code = request.POST.get("code"),
                sang = request.POST.get("sang"),
                su = request.POST.get("su"),
                dan = request.POST.get("dan"),
                ).save()
            return HttpResponseRedirect('/sangpum/list') # 추가 후 목록 보기

 

 * insert.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
	window.onload = function(){
		document.getElementById("btnSummit").onclick = function(){
			chkData()
		}
	}
	function chkData(){
		//alert('a');
		if(frm.code.value === "" | frm.sang.value === ""){ // 입력자료 오류 검사
			alert("입력자료를 모두 채우시오.")
			return;
		}
		frm.submit();
	}
</script>

</head>
<body>
<h2>상품 추가</h2>
<form action="/sangpum/insertok" method="post" name="frm">{% csrf_token %}
	<table class="table" style="width:80%;">
		<tr>
			<td>코드 : </td>
			<td><input class="form-control" type="text" name="code"/>{{msg}}</td>
		</tr>
		<tr>
			<td>품명 : </td>
			<td><input class="form-control" type="text" name="sang"/></td>
		</tr>
		<tr>
			<td>수량 : </td>
			<td><input class="form-control" type="text" name="su"/></td>
		</tr>
		<tr>
			<td>단가 : </td>
			<td><input class="form-control" type="text" name="dan"/></td>
		</tr>
		<tr>
			<td colspan="4">
				<input class="btn-primary" type="button" value="저장" id="btnSummit">
			</td>
		</tr>
	</table>
</form>
</body>
</html>

 

⑤ 게시물 수정

 

 * views

def UpdateFunc(request):
    data = Sangdata.objects.get(code = request.GET.get('code'))
    return render(request, 'update.html', {'sang_one':data})

def UpdateokFunc(request):
    if request.method == 'POST':
        upRec = Sangdata.objects.get(code=request.POST.get('code'))
        upRec.code = request.POST.get('code')
        upRec.sang = request.POST.get('sang')
        upRec.su = request.POST.get('su')
        upRec.dan = request.POST.get('dan')
        upRec.save()
    return HttpResponseRedirect('/sangpum/list') # 수정 후 목록 보기

 

 * update.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>상품 수정</h2>
<form action="/sangpum/updateok" method="post">{% csrf_token %}
	<table class="table" style="width:80%;">
		<tr>
			<td>코드 : </td>
			<td>
				{{sang_one.code}}
				<input class="form-control" type="hidden" name="code" value="{{sang_one.code}}"/>
			</td>
		</tr>
		<tr>
			<td>품명 : </td>
			<td><input class="form-control" type="text" name="sang" value="{{sang_one.sang}}"/></td>
		</tr>
		<tr>
			<td>수량 : </td>
			<td><input class="form-control" type="text" name="su" value="{{sang_one.su}}"/></td>
		</tr>
		<tr>
			<td>단가 : </td>
			<td><input class="form-control" type="text" name="dan" value="{{sang_one.dan}}"/></td>
		</tr>
		<tr>
			<td colspan="4">
				<input class="btn-primary" type="submit" value="수정">
				<input type="button" value="이전화면" onclick="history.back()">
			</td>
		</tr>
	</table>
</form>
</body>
</html>

 

⑥ 게시물 삭제

 * views

def DeleteFunc(request):
    delRec = Sangdata.objects.get(code=request.GET.get('code'))
    delRec.delete()
    return HttpResponseRedirect('/sangpum/list') # 삭제 후 목록 보기

10. 게시판

 = django_test09_board

 

 

+ Recent posts