on
[Django] Admin 페이지 / 동적 URL / views 기초
[Django] Admin 페이지 / 동적 URL / views 기초
반응형
1. Admin
Django에서는 기본적으로 관리자 페이지를 제공해 주는데, 주로 데이터베이스를 관리하는데 쓰인다.
/mysite/urls.py의 urlpatterns에서는, 프로젝트 생성 시부터 'admin/'이 등록되어 있다.
localhost:8000/admin으로 접속해보니 관리자 사이트가 나왔다.
관리자 페이지에 로그인하려면 계정을 생성해야 하며, 다음 명령어로 생성할 수 있다.
python manage.py createsuperuser
간단하게 Username, Email, Password만 설정하면 관리자 계정 생성이 완료된다.
다시 서버를 켜고 로그인을 시도해보자.
최초로 로그인에 성공하면 Groups, Users 2개의 테이블이 존재한다.
Users는 필자가 만든 "users" 앱에 대한 테이블이 아니고, 관리자 계정 테이블이라고 보면 된다.
그렇다면 관리자가 만든 앱에 대한 테이블은 어떻게 생성할까?
admin에서 관리할 테이블들은 /users/admin.py 파일에 등록하면 된다.
from django.contrib import admin from .models import Question, Choice admin.site.register(Question) admin.site.register(Choice)
참고 -
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
다시 서버를 키고 로그인해보니, Users앱의 두 테이블이 성공적으로 추가된 것을 확인할 수 있었다.
레코드의 조회, 추가, 변경, 삭제를 모두 admin 페이지 내에서 UI를 통해 수행할 수 있기 때문에, 편리한 관리를 기대해볼 수 있을 것이다.
2. 동적 URL (튜토리얼 문서 참고)
다음과 같이 <변수형:변수명> 형식으로 URL에 변수를 섞을 수도 있다.
그리고 해당 변수는 요청 처리 메소드의 파라미터로 받아서 사용하면 된다.
3. Template 엔진
1) Jinja2
Django는 Flask와 동일하게 기본 Template 엔진으로 Jinja2을 지원하며, Jinja2 엔진은 HTML 코드에 Python 코드를 섞어 쓸 수 있도록 한다. 이로 인해, HTML 코드에 Python 문법의 조건문, 반복문, 변수 등을 추가할 수 있기 때문에 동적인 페이지를 만들기 좋다.
그리고, HTML 파일은 반드시 "templates" 디렉토리 내에 저장해야 한다.
2) HTML 파일 저장 디렉토리
Django 문서에서는 html 파일을 저장하는 디렉토리로 "[앱 명]/templates/"보다는, "[앱 명]/templates/[앱 명]/"을 사용하는 것을 권장한다. Django는 한 프로젝트에 여러 애플리케이션을 포함할 수 있기 때문에, 이로 인한 템플릿 이름의 중복 가능성을 염두한 것 같다.
HTML코드에 Python코드를 섞어 변수, 조건문, 반복문을 적용한 예제이다.
외부에서 n, rangeA값을 받아올 일만 남았다.
Insert title here n = {{n}} {% if n >= 60 %} PASS {% else %} FAIL {% endif %} {% for i in rangeA %} {{i}} {% endfor %}
3) 요청 처리 메소드
template에는 loader로 불러온 template을 저장하도록 하고, context에는 template에서 사용할 데이터들을 딕셔너리 형태로 담는다. 그리고, template에 context와 request를 채워 넣은 결과를 HttpResponse 객체와 함께 반환했다.
from django.shortcuts import render from django.template import loader from django.http import HttpResponse def index(request): n = 85 a = 5 template = loader.get_template('users/index.html') context = { 'n':n, 'rangeA':range(a), } return HttpResponse(template.render(context, request)) # or use it! # return render(request, 'users/index.html', context)
※ Django에서 Jinja2엔진은 "range()" 문자열을 인식하지 못했기 때문에(파싱 에러), context에서 미리 range(a) 값을 'rangeA'라는 이름으로 선언해 주었다.
4) 실행 결과
값들이 모두 알맞게 출력되었다.
5) Jinja2 + model 객체 예시 (튜토리얼 문서 참고)
4. 404 에러 일으키기 (튜토리얼 문서 참고)
예외 처리를 위해 404에러를 직접 일으켜야 할 경우도 있다.
먼저, Http404 객체를 사용하여 에러를 일으키는 방법은 다음과 같다.
그리고 get_object_or_404() 메소드에게 예외 발생 결정권을 맡기는 방법도 있다. (객체를 못찾으면 에러 발생)
5. URL name (튜토리얼 문서 참고)
urlpatterns에서 경로별로 설정한 URL 이름을 template 내에서 사용할 수 있다.
서로 다른 앱 간의 이름이 중복됐을 경우에 이를 구분할 수 있게, app_name(namespace)을 앱의 이름으로 작성해두는 것이 좋다.
예) polls/urls.py - path('/', views.detail, name='detail')에 대한 링크 설정
(Before) URL 이름을 사용하지 않았을 경우
href="/polls/{{ question.id }}/"
(After) URL 이름을 사용했을 경우
href="{% url 'polls:detail' question.id %}"
반응형
from http://kimcoder.tistory.com/346 by ccl(A) rewrite - 2021-08-09 05:00:43