Language/Python

[Python] ์žฅ๊ณ  shell/ํ…œํ”Œ๋ฆฟ์œผ๋กœ html ๋ถˆ๋Ÿฌ์˜ค๊ธฐ/ํ…œํ”Œ๋ฆฟ์— ์ •๋ณด ์ฒด์šฐ๊ธฐ/MVC ํŒจํ„ด/์—ฌ๋ก ์กฐ์‚ฌ ๋ชจ๋ธ

Dexter_- 2017. 8. 11. 12:23
728x90
๋ฐ˜์‘ํ˜•

 

 

 

์žฅ๊ณ  shell

๐Ÿ“Œ SHELL - ์ง์ ‘ DB์— ์š”์ฒญ์„ ํ•˜๋Š” ๋‹ค๋ฅธ๋ฐฉ๋ฒ•

 

์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ Shell ์‹คํ–‰ ๋ฐฉ๋ฒ•

  • windows - powershell์—์„œ
  • unix/linux - ํ„ฐ๋ฏธ๋„์—์„œ

 

  • manage.py ๊ฐ€ ์žˆ๋Š” ํด๋”๋กœ ์ด๋™ ํ›„
  • python manage.py shell

 

DB์— ์š”์ฒญํ•˜๊ธฐ

  •  ๊ธฐ๋ณธ - ์‚ฌ์šฉํ•  ๋ชจ๋ธ ํด๋ž˜์Šค import

>>> from elections.models import Candidate

 

  • ๋ชจ๋“  ๊ฐ์ฒด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ - all()

>>> Candidate.objects.all()

 

  • ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ - Model.save()

>>> new_candidate = Candidate(name = "๋ฃจ๋น„์˜ค") # ์ƒ์„ฑ๋งŒ ํ•œ ์ƒํƒœ์ด๋‹ค. ์•„์ง ์ €์žฅ๋˜์ง€ ์•Š์•˜์Œ.

>>> new_candidate.save() # new_candidate๊ฐ€ DB์— ์ €์žฅ๋จ

 

  • ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ์ฒด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ - filter()

>>> no1 = Candidate.objects.filter(party_number = 1) # party_number = 1์ธ ๊ฐ์ฒด๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ return

>>> no1[0].party_number # ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— index๋กœ ์ ‘๊ทผ

>>> no1[0].name

 

Script ์ „์ฒด

 

 

 

ํ…œํ”Œ๋ฆฟ์œผ๋กœ html ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  1. ์„œ๋ฒ„ ์‹คํ–‰ - python manage.py runserver
  2. ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8000 ์œผ๋กœ ์ ‘์†
  3. HTML ์†Œ์Šค๋ณด๊ธฐ
    1. windows
      • internet Explore :
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ์†Œ์Šค๋ณด๊ธฐ
        • Ctrl + U
      • Chrome :
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ
        • ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฐ”์— ๋ณด๊ธฐ - ์†Œ์Šค ๋˜๋Š”
        • Ctrl + U
      • Firefox :
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ํŽ˜์ด์ง€ ์†Œ์Šค
        • Ctrl + U
    2. OSX
      • Safari : [Safari - ํ™˜๊ฒฝ์„ค์ • - ๊ณ ๊ธ‰ - ํ•˜๋‹จ์˜ ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ ๊ฐœ๋ฐœ์ž์šฉ ๋ฉ”๋‰ด ๋ณด๊ธฐ ์ฒดํฌ] ํ•„์ˆ˜
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ
        • Command + Option + I
      • Chrome : 
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ
        • ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฐ”์— ๋ณด๊ธฐ - ๊ฐœ๋ฐœ์ž ์ •๋ณด - ์†Œ์Šค๋ณด๊ธฐ
        • Command + Option + U
      • Firefox : 
        • ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ - ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ
        • Command + U
  4. ํ…œํ”Œ๋ฆฟ ์ถ”๊ฐ€ํ•˜๊ธฐ
    1. ์•ฑ (elecetions) ํด๋” ์•„๋ž˜์— templates ํด๋” ์ƒ์„ฑ (C\Code\mysite\elections\templates)
    2. templates ํด๋” ์•„๋ž˜ elections ํด๋” ์ƒ์„ฑ (C\Code\mysite\elections\templates\elections\index.html)
    3. elections ํด๋” ์•„๋ž˜ index.html ํŒŒ์ผ ์ƒ์„ฑ (C\Code\mysite\elections\templates\elections\index.html)
    4. index.html ๊ณผ views.py ์ˆ˜์ •

<!-- C\Code\mysite\elections\templates\elections\index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>์„ ๊ฑฐ ํ›„๋ณด</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>์ด๋ฆ„</B></td>
            <td><B>์†Œ๊ฐœ</B></td>
            <td><B>์ถœ๋งˆ์ง€์—ญ</B></td>
            <td><B>๊ธฐํ˜ธ</B></td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>๊ฐ€ํ›„๋ณด</td>
            <td>ํ›„๋ณด์ž…๋‹ˆ๋‹ค.</td>
            <td>์šฐ๋ฆฌ๋‚˜๋ผ</td>
            <td>๊ธฐํ˜ธ1๋ฒˆ</td>
        </tr>
        <tr>
            <td>๋‚˜ํ›„๋ณด</td>
            <td>ํ›„๋ณด์ž…๋‹ˆ๋‹ค.</td>
            <td>์šฐ๋ฆฌ๋‚˜๋ผ</td>
            <td>๊ธฐํ˜ธ2๋ฒˆ</td>
        </tr>
        <tbody>
    </table>
</body>
# C\code\mysite\elections\views.py
from django.shortcuts import render
from django.http import HttpResponse

from .models import Candidate #models ์— ์ •์˜๋œ Candidate๋ฅผ import
# Create your views here.

def index(request):
    candidates = Candidate.objects.all() 
    return render(request, 'elections/index.html')

 

์ƒˆ๋กœ๊ณ ์นจ ๊ฒฐ๊ณผ

 

 

 

ํ…œํ”Œ๋ฆฟ์— ์ •๋ณด ์ฑ„์šฐ๊ธฐ

์œ„์˜ ๋‚ด์šฉ์€ํ›„๋ณด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ •์ ์œผ๋กœ ๋ณด์—ฌ์คฌ๋‹ค. ์ด๋ฒˆ์—๋Š” DB์— ์žˆ๋Š” ์ •๋ณด๋ฅผ html html๋กœ ์ „๋‹ฌํ•ด ํ›„๋ณด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

 

  • views.py ์—์„œ DB์— ์žˆ๋Š” ํ›„๋ณด ์ •๋ณด๋ฅผ html์— ์ „๋‹ฌ
# mysite\elections\views.py

from django.shortcuts import render
from django.http import HttpResponse

from .models import Candidate #models ์— ์ •์˜๋œ Candidate๋ฅผ import
# Create your views here.

def index(request):
    candidates = Candidate.objects.all() 
    context = {'candidates':candidates}    #context์— ๋ชจ๋“  ํ›„๋ณด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅ 
    return render(request, 'elections/index.html', context)    # context๋กœ html ์— ๋ชจ๋“  ํ›„๋ณด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌ

 

  • index.html์—์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ์ „๋‹ฌ๋ฐ›์€ ํ›„๋ณด ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
<!-- mysite\elections\templates\elections\index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>์„ ๊ฑฐ ํ›„๋ณด</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <table class="table table-striped">
        <thead>
        <tr>
            <td><B>์ด๋ฆ„</B></td>
            <td><B>์†Œ๊ฐœ</B></td>
            <td><B>์ถœ๋งˆ์ง€์—ญ</B></td>
            <td><B>๊ธฐํ˜ธ</B></td>
        </tr>
        </thead>
        <!-- ์ด ๋ถ€๋ถ„์ด ์ˆ˜์ •๋จ -->
        <tbody>
        {% for candidate in candidates %}
        <tr>
            <td>{{candidate.name}}</td>
            <td>{{candidate.introduction}}</td>
            <td>{{candidate.area}}</td>
            <td>๊ธฐํ˜ธ{{candidate.party_number}}๋ฒˆ</td>
        </tr>
        {% endfor %}
        <!-- ์—ฌ๊ธฐ๊นŒ์ง€ -->
        <tbody>
    </table>
</body>

 

 

 

 

MVC ํŒจํ„ด (Model View Controller Pattern)

๐Ÿ“Œ ์กฐ์œจ, ๋ฐ์ดํ„ฐ, ํ™”๋ฉด์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹

  • Model(๋ฐ์ดํ„ฐ) - models.py
    • candidate ํด๋ž˜์Šค์˜ ํ˜•์‹๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅ, ๋ถˆ๋Ÿฌ์˜ด
  • View(ํ™”๋ฉด) - templates
    • ํ™”๋ฉด์— ์–ด๋–ค ์žฅ๋ฉด์„ ๋ณด์—ฌ์ค„์ง€๋ฅผ ๊ฒฐ์ •
  • Controller(์กฐ์œจ) - views.py
    • Candidate ๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด, index.html์— ์ „๋‹ฌ

 

 

์—ฌ๋ก ์กฐ์‚ฌ ๋ชจ๋ธ

๐Ÿ“Œ models.py ์—๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋ธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ƒˆ๋กœ์šด ๋ชจ๋ธ์„ models.py์— ์ •์˜ ํ•œ๋‹ค.
#C:\mysite\elections\models.py
from django.db import models

# Create your models here.
class Candidate(models.Model):
    name = models.CharField(max_length=10)
    introduction = models.TextField()
    area = models.CharField(max_length=15)
    party_number = models.IntegerField(default=0)

    def __str__(self):
        return self.name

class Poll(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    area = models.CharField(max_length=15)

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    candidate = models.ForeignKey(Candidate)
    votes = models.IntegerField(default=0)

 

  • admin ์—์„œ Poll ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, admin.py์— Poll์„ ๋“ฑ๋ก(regist)ํ•œ๋‹ค.
from django.contrib import admin
from .models import Candidate, Poll

# Register your models here.
admin.site.register(Candidate)
admin.site.register(Poll)

 

  • ๋ชจ๋ธ ๋“ฑ๋ก

migration ํŒŒ์ผ์„ ๋งŒ๋“  ํ›„ - migration ํŒŒ์ผ์„ DB์— ๋ฐ˜์˜ - runserver ๊ณผ์ •์„ ๋ฐŸ๋Š”๋‹ค.

powershell ๋“ฑ์—์„œ manage.py ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ํ›„ ์•„๋ž˜ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.

python manage.py makemigrations

 

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด migrations ์— ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด ์กŒ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

  • ์œ„ Poll ํ•„๋“œ์— id ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

python manage.py migrate

python manage.py runserver

 

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8000/admin ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด Poll์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์œ„์—์„œ ์‚ฌ์šฉ๋œ ํ•„๋“œ ํด๋ž˜์Šค๋ฅผ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

DateTimeField
date(๋‚ ์งœ)์™€ time(์‹œ๊ฐ„)์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ptyhon์˜ datetime.datetime ์ธ์Šคํ„ด์Šค๋กœ ํ‘œํ˜„๋œ๋‹ค.

CharField
String์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•„์ˆ˜ ์ธ์ž max_length๊ฐ€ ์žˆ๋‹ค.
๊ธธ์ด๊ฐ€ ๊ธด ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋ ค๋ฉด TextField ๋“ฑ์„ ์“ฐ๋ฉด ๋œ๋‹ค.
-CharField.max_lengt: ํ•ด๋‹น ํ•„๋“œ์˜ ์ตœ๋Œ€๊ธธ์ด๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 5๋กœ ์„ค์ •ํ•˜๋ฉด 5๊ธ€์ž ์ดํ•˜๋กœ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

IntegerField
์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ํ•„๋“œ๋Š” Django๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ -2147483648์—์„œ 2147483647 ๊นŒ์ง€์˜ ์ •์ˆ˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•œ๋‹ค. ๋” ํฐ ์ •์ˆ˜๋Š” BigIntegerField ๋“ฑ์„ ์ด์šฉํ•œ๋‹ค.

ForeignKey
ํ•œ ๋ชจ๋ธ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์ด์šฉํ•  ๋•Œ์— ์“ฐ์ธ๋‹ค.(๋ณดํ†ต many-to-one ๊ด€๊ณ„ ๋ชจ๋ธ์—์„œ ์ด์šฉํ•œ๋‹ค.)์˜์ƒ์—์„œ๋„ ์—ฌ๋ก ์กฐ์‚ฌ(Poll) id ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ [ํ›„๋ณด-๋“ํ‘œ์ˆ˜] ๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

์ƒˆ๋กœ๊ณ ์นจ ๊ฒฐ๊ณผ

 

 

Poll object Add ํ›„ ์™„๋ฃŒ

 

 

 

728x90
๋ฐ˜์‘ํ˜•