Django

210129_01_Django_(2)

SW Kang 2021. 1. 29. 09:16

MODELS.PY

from django.db import models

# Create your models here.
class Question(models.Model) :
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

class Choice(models.Model) :
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

> 데이터베이스 테이블 생성 (Question 테이블, Choice 테이블)

 

ADMIN.PY

from django.contrib import admin

# Register your models here.
from polls.models import Question, Choice

admin.site.register(Question)
admin.site.register(Choice)

> admin 페이지에 Question 테이블과 Choic 테이블 등록

결과 화면

 

myDjangoSite/ URLS.PY

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')), #
]

> url 등록 : localhost:8000/admin 과 localhost:8000/polls 두 개의 url을 등록

 

 

myDjangoSite/ polls/ URLS.PY

from django.urls import path
from polls import views

app_name = 'polls'

urlpatterns = [
    path('', views.index, name = 'index'), # /polls/
]

> url 과 view 연결 : url 'polls' 로 접속 시 view 의 index 함수가 실행되도록 연결

 

VIEWS.PY

def index(request) :
	latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
	context = {'latest_question_list':latest_question_list}
	return render(request, 'polls/index.html', context)

> 수행할 함수 정의

   latest_question_list 에 Question 테이블오브젝트(object) 모두(all) 조회하여 pub_date 칼럼을 역순( - )으로 정렬하여 5개([:5]) 대입

   context 에 latest_question_list 를 딕셔너리 형식으로 대입

   render : template 파일인 index.html에 context 변수를 적용하여 client에게 보여줄 html을 만들어 client에 응답

              거의 대부분의 view 함수에 고정적으로 들어가는 부분

 

 

templates/ polls/ INDEX.HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    {% if latest_question_list %}			// Django 에서 HTML 내부 문서에 Python 사용시
    <ul>
        {% for question in latest_question_list %}
        <li><a href = "/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
        {% endfor %}
    </ul>
    {% else %}
    <p>No polls are available.</p>
    {% endif %}

</body>
</html>

> HTML 문서를 만들어 웹 브라우저에서 보이는 부분

 

 

※ Python Shell 실습 주의사항

더보기

조회에서

q = Question.objects.get(pk=1)

Question의 pk(primary_key)는 id 값인데 auto_increment 방식으로 올라가서 한 번 삭제한 번호는 다시 재지정되지 않는다.

따라서 만약 1번 Question을 삭제하였다면 위의 pk = 1로는 위 코드가 작동하지 않고 pk = 1인 데이터가 없다는 에러가 뜨게 된다.

Question의 id 값은 admin에서도 확인하지 못하기 때문에 sqlite browser를 설치하여 확인하는 수 밖에 없다.