210129_01_Django_(2)
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를 설치하여 확인하는 수 밖에 없다.