python [manage.py](http://manage.py) createsuperuser
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
- 관리자 화면에서 Question 모델 질문 생성, 조회, 수정, 삭제 가능
모델 검색
admin.py (수정)
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
search_fields = ['subject']
admin.site.register(Question, QuestionAdmin)
질문 목록과 질문 상세 기능 구현
from django.shortcuts import render
from .models import Question
#from django.http import HttpResponse
# Create your views here.
def index(request):
question_list = Question.objects.order_by('-create_date') #order_by : 조회 결과 정렬, - : 역방향 정렬
context = {'question_list': question_list}
return render(request, 'pybo/question_list.html', context) #render: 파이썬 데이터를 템플릿에 적용하여 HTML로 반환
pybo/question_list.html
파일 작성 전, 템플릿 저장 디렉터리 설정settings.py
(... 생략 ...)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / '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',
],
},
},
]
(... 생략 ...)
mkdir templates
하나의 웹에서 여러 개의 앱을 사용할 수도 있을므로 경로를projects/mysite/pybo/templates
이 아닌 /projects/mysite/templates/pybo
디렉터리를 사용
공용 템플릿 - projects/mysite/templates
django_prac1/templates/pybo/question_list.html
{% 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 %}
1. 분기
{% if 조건문1 %}
<p>조건문1에 해당되는 경우</p>
{% elif 조건문2 %}
<p>조건문2에 해당되는 경우</p>
{% else %}
<p>조건문1, 2에 모두 해당되지 않는 경우</p>
{% endif %}
2. 반복
{% for item in list %}
<p>순서: {{ forloop.counter }} </p>
<p>{{ item }}</p>
{% endfor %}
3. 객체 출력
# 객체 출력
{{ 객체 }}
# 객체 속성 출력
{{ 객체.속성 }}
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
path('<int:question_id>/', views.detail),
]
# detail 함수 추가
def detail(request, question_id):
question = Question.objects.get(id=question_id)
context = {'question': question}
return render(request, 'pybo/question_detail.html', context)
<h1>{{ question.subject }}</h1>
<div>
{{question.content}}
</div>
from django.shortcuts import render, get_object_or_404
from .models import Question
#from django.http import HttpResponse
# 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)
def detail(request, question_id):
question = get_object_or_404(Question, pk = question_id)
context = {'question': question}
return render(request, 'pybo/question_detail.html', context)
200
- 성공500
- Internal Server Error404
- Resource Not Found Errorquestion_list.html
<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
→ url 리팩토링이 빈번해 구조 변경이 일일이 템플릿을 찾아가 수정해야 함
→ 따라서 실제 링크 대신 링크 주소가 매핑되어 있는 별칭 사용하기
URL 매핑에 name 속성 부여
pybo/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
]
question_list.html
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="{% url 'detail' question.id %}">{{ question.subject }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}
pybo/urls.py
from django.urls import path
from . import views
app_name = 'pybo'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
]
question_list.html
{% url 'pybo:detail' question.id %}