관리자 계정 생성
터미널에서 유저 생성 후, 정보 입력
python manage.py createsuperuser
- 사용자 이름 : admin
- 이메일 주소 : admin@mysite.com
- password : qwer1234
- password : qwer1234
- y 선택(너무 일상적인 비밀번호입니다)
- 로그인해보기 : localhost:8000/admin/
admin.py
모델에 Question Class를 등록합니다.
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question) # Question을 등록해줌
3
view.py / 컬럼리스트 받는 함수 생성
- view.py 수정
- order_by를 통해서 'create_date"를 칼럼의 리스트를 내림차순 순으로 받아옴
- context에 저장하고, render를 통해서 context 받아줌
from django.shortcuts import render
from django.http import HttpResponse
from .models import Question, Answer
# Create your views here.
def index(request):
question_list = Question.objects.order_by('-create_date') # -가 들어가면 내림차순
context = {'question_list' : question_list}
return render(request, 'pybo/question_list.html', context) # request, html 파일, 변수로 담아놨던 question_list
config/settings.py
- config/settings.py를 수정해줘야합니다.
- TEMPLATES 변수의 DIRS를 지정해 주고,
-
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 원래 비어있음, 작업 디렉터리의 templates 디렉터리 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
templates 폴더를 만들고, 하단에 html 파일을 생성합니다.
- Templates 경로는 c:\django_projects\django_start1\templates
- 'pybo\question_list.html' -> 'pybo\ 경로 직접 생성이 필요
question_list.html
반드시 html에서 if와 for는 end로 닫아줍니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='UTF-8'>
</head>
<body>
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="/pybo/{{question.id}}">{{question.subject}}</a></li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}
</body>
</html>
접속
http://127.0.0.1:8000/pybo/ 해당 링크로 연결해 봅니다.
동적 URL 매핑해 보기
pybo/urls.py
url을 지정해 줍니다.
from django.urls import path
from . import views
urlpatterns = [
path("", views.index), # localhost:8000/pybo 주소의 루트를 의미함
# 게시글 제목의 a 태그에 href 속성에 해당하는 동적 URL 매핑
path("<int:question_id>", views.detail)
]
pybo/views.py
views의 함수를 추가해 주고, render를 통해서 변수를 html로 보냅니다.
def detail(request, question_id):
question = Question.objects.get(id = question_id) #
context = {'question' : question}
return render(request, 'pybo/question_detail.html', context)
templates/pybo/question_detail.html
html에서 받은 question 변수를 이용해서 내용을 보여줍니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{question.subject}}</h1>
<div>{{question.content}}</div>
</body>
</html>
페이지 에러일 때 404 에러로 변경하는 법
views.py의 get_object 방식을 바꿉니다.
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Question, Answer
def detail(request, question_id):
question = get_object_or_404(Question, pk = question_id)
# question = Question.objects.get(id = question_id)
context = {'question' : question}
return render(request, 'pybo/question_detail.html', context)
별칭 사용해 보기
- urls.py의 path에서 name 변수를 통해 별칭을 관리합니다.
- appname을 통해서, 별칭의 상위명도 지정해 줍니다.
from django.urls import path
from . import views
app_name = "pybo"
urlpatterns = [
path("", views.index), # localhost:8000/pybo 주소의 루트를 의미함
# 게시글 제목의 a 태그에 href 속성에 해당하는 동적 URL 매핑
path("<int:question_id>", views.detail, name= 'detail')
]
html에는 {% url 'appname:별칭' ~ %}의 방식으로 사용합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='UTF-8'>
</head>
<body>
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="{% url 'pybo:detail' question.id %}">{{question.subject}}</a></li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}
</body>
</html>
답변 등록하기
html 파일에 action을 추가합니다. method는 post로, 별칭으로 submit 데이터를 전달합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{question.subject}}</h1>
<div>{{question.content}}</div>
<hr>
<h5>{{question.answer_set.count}}개의 답변이 있습니다.</h5>
<div>
<ul>
{% for answer in question.answer_set.all %}
<li> {{ answer.content }} </li>
{% endfor %}
</ul>
<form action = "{% url 'pybo:answer_create' question.id %}" method="post">
{% csrf_token %}
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변등록">
</form>
</body>
</html>
urls.py에 답변등록 path를 추가합니다.
# 답변 등록에 대한 URL 매핑
path("answer/create/<int:question_id>/", views.answer_create, name="answer_create")
views.py에 answer_create를 함수를 추가합니다.
from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse
from .models import Question, Answer
from django.utils import timezone
def answer_create(request, question_id):
question = get_object_or_404(Question, pk=question_id)
# 아래 create 함수는 Answer 클래스 모델을 가져와 저장할 때 사용하는 save()랑 동일한 기능
a = question.answer_set.create(content=request.POST.get("content"), create_date = timezone.now())
return redirect("pybo:detail", question_id= question.id)
'웹 애플리케이션 > Django(장고)' 카테고리의 다른 글
[Django] 템플릿 include (0) | 2023.04.19 |
---|---|
[Django] 화면 꾸미기 (1) | 2023.04.19 |
[Django] 앱 생성, 데이터베이스 연동, ORM (1) | 2023.04.13 |
[Django] 시작하기(Conda, VS코드 쉽게) (0) | 2023.04.12 |
[Django] 시작하기(venv 모듈 활용) (0) | 2023.04.12 |