Language/Python [Python] ์žฅ๊ณ  shell/ํ…œํ”Œ๋ฆฟ์œผ๋กœ html ๋ถˆ๋Ÿฌ์˜ค๊ธฐ/ํ…œํ”Œ๋ฆฟ์— ์ •๋ณด ์ฒด์šฐ๊ธฐ/MVC ํŒจํ„ด/์—ฌ๋ก ์กฐ์‚ฌ ๋ชจ๋ธ
  • 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
    ๋ฐ˜์‘ํ˜•
์ƒ๋‹จ์œผ๋กœ