티스토리 뷰
Philosophy
Generating admin sites for your staff or clients to add, change and delete content is tedious work that doesn’t require much creativity. For that reason, Django entirely automates creation of admin interfaces for models.
Django was written in a newsroom environment, with a very clear separation between “content publishers” and the “public” site. Site managers use the system to add news stories, events, sports scores, etc., and that content is displayed on the public site. Django solves the problem of creating a unified interface for site administrators to edit content.
The admin isn’t intended to be used by site visitors. It’s for site managers.
*admin user 생성하기
우선 우리는 admin site에 로그인이 가능한 유저를 생성해야한다.(비밀번호는 1234567890 )
$ python manage.py createsuperuser
Username (leave blank to use 'eminentstar'): admin
Email address: pjk3843@gmail.com
Password:
Password (again):
Superuser created successfully.
$ python manage.py runserver
-그리고 http://127.0.0.1:8000/admin 로 접속하라.
그러면 다음과 같은 로그인 화면이 뜰 것이다.
*관리자 페이지에 들어가기.
로그인 후 이 화면이 보일 것이다. 이 몇개의 수정가능한 내용은 django.contrib.auth에 의해 제공되는데 장고의 의해 shipped된 the authentication framework다.
*Make the poll app modifiable in the admin
그러나 우리의 poll app은 볼 수가 없다. 단 한가지를 해보자. 우리는 우리의 admin에게 Question 객체가 admin 인터페이스를 가진다는 걸 말할 필요가 있다. 이것을 하기위해서 polls/admin.py 파일을 열고 수정을 하자.
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
*자유로운 관리자 기능을 탐험하자.
이제 Question이 등록되었고, Django는 Question항목이 admin index 페이지에 보여야만 한다는 것을 안다.
Questions를 클릭해보자. questions를 위한 'change list'에 있다.
이 페이지는 디비에 있는 모든 questions를 보여주고 그것을 변경할 수 있게 선택 할 수 있다. 앞서 Part 1에서 생성한 question이 보인다.
클릭을 하면 수정이 가능하다.
주목할 만한게 몇가지 있다.
- 폼은 Question 모델로 부터 자동적으로 생성된다.
- The different model field types(DateTimeField, CharField)는 적절한 HTML 입력 위젯과 상응된다.
- 각각의 DateTimeField는 자바스크립트 shortcuts을 얻는다. ex) Today, Now
- Save: 변화를 저장하고 change-list 페이지를 반환한다.
- Save and continue editing: 변화를 저장하고, 이 객체에 대한 관리자 페이지를 reload한다.
- Save and add another: 변화를 저장하고 새로운 이 객체에 대한 텅빈 폼을 load한다.
- Delete: 삭제 Confirmation 페이지를 보여준다.
*Customize the admin form
admin.site.register(Question)를 Question 모델과 함께 등록함으로써, Django는 default form representation을 설계할 수 있다.장고에게 몇가지 등록 사항을 말함으로써 우리는 admin form을 custromize 할 수 있다. polls/admin.py의 admin.site.register(Question) 라인을 대체 해보자.
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date','question_text']
admin.site.register(Question, QuestionAdmin)
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
admin.site.register(Question, QuestionAdmin)
from django.contrib import admin
from .models import Question,Choice
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
여기서 Question 필드가 DB의 모든 question을 선택할 수 있게 되어있고, Django는 외래키가 select box로서 표현된다는 것을 알아야만 한다.
그러나 이것은 비효율적이다. Question 객체를 생성할 때 복수의 Choices를 바로 추가할 수 있다면 그게 더 좋을 것 같다.
register()를 지우고, Choice 모델을 불러와라. 그리고 Question 등록 코드를 수정하라.
-polls/admin.py
from django.contrib import admin
from .models import Question,Choice
# Register your models here.
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
extra 속성에 의해 3개의 Choice 필드가 생성되었다.
추가도 가능하다.
그러나 한가지 문제가 또 있다. 이것은 어마어마한 화면 공간을 차지한다. 이러한 이유에서 Django는 a tabular way of displaying inline related objects를 제공한다. 다음코드를 수정하라.
-polls/admin.py
# Register your models here.
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 3
StackedInline대신에 TabularInline과 함께 관계된 객체들은 더 압축적이고 table-based 형식을 가지게 된다.
디폴트로, Django는 각 객체의 str()를 보여준다. 그러나 때로는 개개인의 필드를 보여준다면 도 유용할 수 있다. 이것을 하기 위해서, list_display 관리자 속성을 사용해야 한다. 이 속성은 객체에 대한 change list위의 컬럼들으로서 보여주기 위한 필드네임들의 튜플이다.
-polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
list_display = ('question_text', 'pub_date')
단순히 보기 좋게 하기 위해 was_published_recently 도 포함시키자.
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
list_display = ('question_text', 'pub_date', 'was_published_recently')
헤더를 클릭하면 정렬을 할 수 있다.(was_published_recently를 제외하고; 이유는 arbitrary method의 결과 정렬은 지원되지 않기 때문이다. 또한 이 메서드 컴럼의 헤더는 메서드의 이름이다.)
우리는 이 메서드에 대해서 몇가지 속성을 줌으로써 표현방식을 향상시킬 수 있다.
class Question(models.Model):# Inherited 'django.db.models.Model'
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self): # __unicode__ on Python 2
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
For more information on these method properties, see list_display.
그리고 polls/admin.py 파일을 다시 수정하고, 향상된 것을 Question change list page에 추가하라.(filter using the list_filter)
QuestionAdmin에 다음 라인을 추가하라.
list_filter = ['pub_date']
그럼 "Filter" 라는 사이드바가 생성된다.
search_fields = ['question_text']
Now’s also a good time to note that change lists give you free pagination. The default is to display 100 items per page. Change list pagination, search boxes, filters, date-hierarchies, and column-header-ordering all work together like you think they should.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]
code of Django itself (django/contrib/admin/templates) into that directory.
Where are the Django source files?
If you have difficulty finding where the Django source files are located on your system, run the following command:
$ python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"
EminentStarui-MacBook-Pro:mysite eminentstar$ python -c "
> import sys
> sys.path = sys.path[1:]
> import django
> print(django.__path__)"
['/Library/Python/2.7/site-packages/django']
/Library/Python/2.7/site-packages/django/contrib/admin/templates/admin
cp base_site.html ~/Documents/Programming/PythonProgramming/mysite/templates/admin/
{% extends "admin/base.html" %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}
{% block nav-global %}{% endblock %}
~
우리는 이 접근을 너가 어떻게 템플릿들을 오버라이드 하는지 가르치기 위해 사용한다.
실제 프로젝트에에서는 너는 아마 "django.contrib.admin.AdminSite.site_header" attribute를 특정한 커스터마이징을 더 쉽게 하기위해 사용할 것이다.
이 템플릿 파일은 다량의 텍스트 ({% block title %} 나 {{ title }} 와 같은)를 포함하고 있다.
여기서 "{%" 와 "{{" 태그는 Django's template language의 일부이다. Django renders가 admin/base_site.html을 읽을때, 이 템플릿 랭귀지가 최후의 HTML 페이지를 생산하기 위해 평가되어질 것이다.
Part 3에서 자세히 다룰 것이다.
어떤 Django's default admin templates는 오버라이드가 가능하다는 것에 주목하라. 템플릿을 수정하기 위해 base_site.html에서 햇던것과 같은 것을 하면 된다. 복사해서 넣고 수정하면 된다.
*Customizing your application's templates
DIRS 옵션이 비어있다면 어떻게 Django는 디폴트 admin templates를 찾을까? 정답은 APP_DIRS가 True로 설정돼있는 이래로, Django는 자동적으로 애플리케이션 패키지내의 templates/ 서브 디렉토리를 찾을 것인데 fallback으로써..
*Customize the admin index page
django.contrib.admin의 index.html을 나의 랩의 templates/admin/로 옮기자.
'Server Side > Django' 카테고리의 다른 글
Django 보일러플레이트 셋팅 (0) | 2017.02.09 |
---|---|
종속성이 명시적으로 선언되고 분리된 장고 프로젝트 시작하기(Starting a django Project with explicitly declaring and isolating Dependencies ) (0) | 2016.09.05 |
Django app 시작하기 Part 3: Views and templates (0) | 2015.08.01 |
Django app 시작하기 Part 1: Models (0) | 2015.07.29 |
장고 설치하기 (0) | 2015.07.29 |
- Total
- Today
- Yesterday
- object
- runtime data areas
- linux
- log level
- NGINX
- JVM
- webserver
- slf4j
- Spring
- java
- Apache
- logging facade
- logback
- TaskExecutor
- lood
- logging
- async
- log
- good practice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |