2022. 1. 11. 21:32ㆍ카테고리 없음
장고의 특징은 admin관리자를 자동으로 잘 생성해 주는 특징을 가지고 있다. 이 시간에는 이것에 대해 알아보도록 한다. 먼저 관리 사이트에 로그인 할 수 있는 사용자를 생성해 보도록 하자. 아래의 명령어를 입력한 후 원하는 username, E-mail, password를 설정해 주자. 특히 password는 확인을 위해 다시 2번 입력해야한다.
python manage.py createsuperuser
값은 임의로 주면 된다. 이 후 서버를 실행하여 Django에 접속하도록 하자.
python manage.py runserver
자 그런데 우리는 서버로 접근하기 위해서 어떤 URL로 접근해야 할까? 이 전 시간에 만든 mysite의 URL을 보면 우리는 "admin"으로 접근해야 하는 것임을 알 수 있다.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
http://127.0.0.1:8000/admin로 접근하면 다음과 같은 화면이 나타나는 것을 확인할 수 있다. 방금 만든 admin계정을 입력해 보자. 그러면 다음과 같이 관리자 페이지로 접근할 수 있게 된다.
아무런 설정을 하지 않았더라도 기본적으로 제공해 주는 url등이 있음을 확인할 수 있다. 이제 좀 더 편하게 DB를 설정하고 변경하기 위해 데이터제어기능을 추가해 보도록 하자.
polls안의 admin.py에 다음과 같은 명령어를 추가하도록 하자. Question과 Choice라는 인터페이스가 있음을 알려주는 명령이다. 이 명령을 추가하게 되면 이 두가지를 자유롭게 제어할 수 있게 된다.
from django.contrib import admin
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
다음과 같이 Questions과 Choice가 활성화 된 것을 확인할 수 있으며 이전 시간에 했던 question.어쩌고 할 필요없이 편하게 CRUD를 할 수 있다.
자 이제 질문을 추가해 보도록 하자. 상단의 ADD QUESTION을 클릭하여 마음것 추가하자. 본인은 짧게 3가지 정도만 추가해 봤다.
이제 Choices들을 추가해 보도록 하자. 왼쪽의 메뉴에서 Choices를 클릭한 후 우측 상단의 ADD CHOICE를 클릭하여 질문을 만드는것과 같이 만들어 주면 된다.
이제 우리는 DB를 하나 만들게 되었다. 이제 본격적으로 빌드를 구축해 보도록 하자. 설문조사를 하기 위해서는 먼저 사이트, 홈페이지 등등 http(s)로 구동되는 페이지가 필요하다. 이것을 만들 views를 추가하도록 하자.
polls의 views.py파일을 다음과 같이 변경하자.
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
이 후 polls의 urls.py파일에 다음과 같은 내용으로 변경하자.
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
이렇게 되면 127.0.0.1:8000/polls/ 에 접근해 해당하는 url을 입력하면 잘 실행 되는것을 확인할 수 있다. 하지만 고작 여기서 만족하기엔 실제로 사용하기에 많은 부족함을 느낄 것이다. 이제 뷰를 하나씩 체워보도록 하자. polls의 views.py파일에 다음과 같은 내용을 추가하자.
최근 질문5개를 바탕으로 " , " 를 바탕으로 join을 시킨다.
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
그럼 다음과 같은 화면이 나타나게 된다. 하지만 아직도 많이 부족함을 느낄 수 있다. 일반적으로 사용하는 html 형식이 아닌 단순 텍스트만 존재하기에 이제 여기에 템플릿을 하나 추가해 보도록 하자.
mysite>polls>templates>polls>index.html 을 순서대로 형성하자.
이후 index.html에 다음과 같은 진자언어를 추가하도록 하자. 진자언어는 반드시 "{% %}" 라는 형식을 갖춰야 하며 이 사이에 원하는 명령을 입력해야 한다. 여기서 주의해야할 점은 if문이 끝날 경우 반드시 endif를, for문이 끝날 경우 반드시 endfor라는 명령어를 기입해 줘야 한다.
lates_question_list가 있으면 for문으로 작동된다는 의미이다.
{% if latest_question_list %}
<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 %}
조금 복잡하지만 조금만 더 힘내서 따라오면 된다! 다음으로는 views.py를 다음과 같이 수정하도록 하자.
polls안의 index파일을 불러오라는 의미를 가지고 있다. 또한 위에서 인자로 받을 lates_question_list를 추가해 JSON형식으로 부여한다.
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
이 코드가 너무 길다면 render라는 것을 활용해 바꿀 수 도 있다.
이후 다시 polls에 접근을 하면 다음과 같은 화면이 나타난다. 또한 이 사이트를 F12 버튼을 활용해 개발자 모드로 보게 된다면 <li>가 3번 for 된 것을 확인할 수 있다.
자 이제 어느정도 틀도 갖춰진거 같다. 이제 조금 특별한 것을 해 보도록 할텐데 바로 404 에러를 일으켜 볼 것이다. 지금 우리가 가지고 있는 정보는 polls안의 질문을 클릭하면 6, 7, 8번 페이지로 넘어가는 것을 알 수 있다. 하지만 url을 입력하면 다른 페이지로도 손쉽게 넘어갈 수 있는것을 확인할 수 있다. 이것을 방지하기 위한 404 에러를 만들어 보도록 하자. 즉 실제 DB에 값이 없으면 404 에러가 발생한다는 의미이다.
polls의 views.py에 다음과 같은 내용을 추가 하도록 하자.
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
polls/templates/polls/detail.html이라는 파일을 형성하여 다음과 같은 명령어를 입력하도록 하자.
{{ question }}
짜잔!! 다음과 같이 404 에러가 잘 뜨는 것을 확인할 수 있다.
하지만 조금만 더 고급지게 바꿔보도록 하자. detail.html에 다음과 같은 명령어를 추가하자. question에 question_text가 나타나도록하며 해당되는 choice를 li태그로 보여주도록 하겠다는 의미이다.
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
와우 이제 점점 뭔가 익숙한 화면이 되어가고있다. 이제 어느정도는 데이터를 주고 받고, 출력하는 형태까지는 형성되었다.
다음에 해 볼 것은 사용자가 입력된 값이 실제 DB에 저장되는 과정을 설명해 보도록 하겠다.