Django 의 admin 구성 요소 의 사용 과 소스 분석 을 자세히 설명 합 니 다.
Django 는 웹 기반 관리 도 구 를 제공 합 니 다.
Django 자동 관리 도 구 는 django.contrib 의 일부분 입 니 다.프로젝트 의 settings.py 에 있 는 INSTALLEDAPPS 에서 보 았 습 니 다:
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"app01"
]
django.contrib 는 방대 한 기능 집합 으로 Django 기본 코드 의 구성 부분 입 니 다.활성화 관리 도구
보통 항목 을 만 들 때 urls.py 에서 자동 으로 설정 합 니 다.
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
이 모든 것 이 설정 되면 Django 관리 도 구 를 실행 할 수 있 습 니 다.관리 도구 사용
개발 서버 를 시작 하고 브 라 우 저 에 접근 합 니 다.http://127.0.0.1:8000/admin/로그 인 인터페이스 를 얻 으 면 python manage.py createperuser 명령 을 통 해 슈퍼 사용 자 를 만 들 수 있 습 니 다.
admin 인터페이스 에서 특정한 데이터 모델 을 관리 하기 위해 서 는 이 데이터 모델 을 admin 에 등록 해 야 합 니 다.
from django.db import models
class Author(models.Model):
name=models.CharField( max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
class Publish(models.Model):
name=models.CharField( max_length=32)
email=models.EmailField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)
publisher=models.ForeignKey(to="Publish")
authors=models.ManyToManyField(to='Author')
def __str__(self):
return self.title
admin 의 맞 춤 형 제작admin.py 에서 Mode 의 특정한 유형 만 등록 하면 Admin 에서 삭제 하고 검사 하 는 기능 을 실현 할 수 있 습 니 다.예 를 들 어:
admin.site.register(models.UserInfo)
그러나 이런 방식 은 비교적 간단 하 다.만약 에 더 많은 맞 춤 형 조작 을 하려 면 ModelAdmin 을 이용 하여 조작 해 야 한다.예 를 들 어:방식 1:
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd',)
admin.site.register(models.UserInfo, UserAdmin) #
방식 2:
@admin.register(models.UserInfo) #
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd',)
ModelAdmin 에서 대량의 맞 춤 형 기능 을 제공 합 니 다.예 를 들 어1. list_display,목록 시 디 스 플레이 열 을 맞 춥 니 다.
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd', 'xxxxx')
def xxxxx(self, obj):
return "xxxxx"
2. list_display_링크,목록 시 맞 춤 형 열 은 점프 를 클릭 할 수 있 습 니 다.
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd', 'xxxxx')
list_display_links = ('pwd',)
3. list_filter,목록 시 오른쪽 빠 른 선별 을 맞 춥 니 다.4. list_select_related,목록 시 자동 선택 여 부 를 연속 으로 조회 합 니 다related
5. list_편집 가능 한 열
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd','ug',)
list_editable = ('ug',)
6. search_fields,목록 에서 모호 한 검색 기능
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
search_fields = ('user', 'pwd')
7. date_hierarchy,목록 에서 Date 와 DateTime 형식 을 검색 합 니 다.
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
date_hierarchy = 'ctime'
8 inlines,상세 페이지,다른 표 와 현재 표 가 FK 를 한다 면 상세 페이지 는 동적 으로 증가 하고 삭제 할 수 있 습 니 다.
class UserInfoInline(admin.StackedInline): # TabularInline
extra = 0
model = models.UserInfo
class GroupAdminMode(admin.ModelAdmin):
list_display = ('id', 'title',)
inlines = [UserInfoInline, ]
9 action,목록 시 맞 춤 형 action 의 동작
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
# Action
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
func.short_description = " Actions"
actions = [func, ]
# Action
actions_on_top = True
# Action
actions_on_bottom = False
#
actions_selection_counter = True
10 맞 춤 형 HTML 템 플 릿
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None
11 raw_id_fields,상세 페이지,FK 와 M2M 필드 에 대해 Input 상자 형식 으로 변경
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
raw_id_fields = ('FK ', 'M2M ',)
12 fields,상세 페이지 시 필드 필드 표시
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fields = ('user',)
13.exclude,상세 페이지 에서 제외 한 필드
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
exclude = ('user',)
14 readonly_fields,상세 페이지 시 필드 만 읽 기
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
readonly_fields = ('user',)
15 fieldsets,상세 페이지 시 fieldsets 탭 을 사용 하여 데 이 터 를 분할 표시 합 니 다.
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fieldsets = (
(' ', {
'fields': ('user', 'pwd', 'ctime',)
}),
(' ', {
'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
'fields': ('user', 'pwd'),
}),
)
16 상세 페이지 시 M2M 표시 시 데이터 이동 선택(방향:상하 좌우)
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
filter_vertical = ("m2m ",) # filter_horizontal = ("m2m ",)
17 ordering,목록 시 데이터 정렬 규칙
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
ordering = ('-id',)
def get_ordering(self, request):
return ['-id', ]
18. radio_fields,자세 한 페이지 는 radio 디 스 플레이 옵션 을 사용 합 니 다(FK 는 기본적으로 select 를 사용 합 니 다)
radio_fields = {"ug": admin.VERTICAL} # admin.HORIZONTAL
19 form=ModelForm,사용자 요청 시 폼 검증 맞 춤 형
from app01 import models
from django.forms import ModelForm
from django.forms import fields
class MyForm(ModelForm):
others = fields.CharField()
class Meta:
model = models = models.UserInfo
fields = "__all__"
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
form = MyForm
20 empty_value_display="열 데이터 가 비어 있 을 때 기본 값 표시"
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
empty_value_display = " , "
list_display = ('user','pwd','up')
def up(self,obj):
return obj.user
up.empty_value_display = " , "
from django.contrib import admin
# Register your models here.
from .models import *
class BookInline(admin.StackedInline): # TabularInline
extra = 0
model = Book
class BookAdmin(admin.ModelAdmin):
list_display = ("title",'publishDate', 'price',"foo","publisher")
list_display_links = ('publishDate',"price")
list_filter = ('price',)
list_editable=("title","publisher")
search_fields = ('title',)
date_hierarchy = 'publishDate'
preserve_filters=False
def foo(self,obj):
return obj.title+str(obj.price)
# Action
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
func.short_description = " Actions"
actions = [func, ]
# Action
actions_on_top = True
# Action
actions_on_bottom = False
#
actions_selection_counter = True
change_list_template="my_change_list_template.html"
class PublishAdmin(admin.ModelAdmin):
list_display = ('name', 'email',)
inlines = [BookInline, ]
admin.site.register(Book, BookAdmin) #
admin.site.register(Publish,PublishAdmin)
admin.site.register(Author)
admin 소스 코드 분석단일 모드
단일 모드(Singleton Pattern)는 자주 사용 하 는 소프트웨어 디자인 모델 로 이 모델 의 주요 목적 은 특정한 유형 이 하나의 인 스 턴 스 만 존재 하도록 확보 하 는 것 이다.전체 시스템 에서 하나의 인 스 턴 스 만 나타 나 기 를 원 할 때 하나의 대상 만 사용 할 수 있다.
예 를 들 어 한 서버 프로그램의 설정 정 보 는 한 파일 에 저장 되 고 클 라 이언 트 는 AppConfig 클래스 를 통 해 설정 파일 의 정 보 를 읽 습 니 다.프로그램 이 실행 되 는 동안 설정 파일 의 내용 을 사용 해 야 하 는 곳 이 많 습 니 다.즉,많은 곳 에서 AppConfig 대상 의 인 스 턴 스 를 만들어 야 합 니 다.이 로 인해 시스템 에 여러 개의 AppConfig 인 스 턴 스 대상 이 존재 합 니 다.그러면 메모리 자원 을 심각하게 낭비 할 수 있 습 니 다.특히 파일 의 내용 이 많은 상황 에서.사실 AppConfig 와 같은 클래스 는 프로그램 이 실행 되 는 동안 하나의 인 스 턴 스 대상 만 존재 하 기 를 바 랍 니 다.
Python 에서 우 리 는 여러 가지 방법 으로 단일 모드 를 실현 할 수 있 습 니 다.
사용 모듈
사용 __new__ 장식 기 사용(decorator)메타 클래스 사용(metalass)(1)사용new__
클래스 에 하나의 인 스 턴 스 만 나타 나 게 하기 위해 서 우 리 는 을 사용 할 수 있 습 니 다.new__ 인 스 턴 스 생 성 과정 을 제어 합 니 다.코드 는 다음 과 같 습 니 다.
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
위의 코드 에서 우 리 는 클래스 의 인 스 턴 스 와 클래스 변 수 를하면,만약,만약... cls._인 스 턴 스 가 None 이면 인 스 턴 스 를 만 듭 니 다.그렇지 않 으 면 바로 돌아 갑 니 다. cls._instance 。실행 상황 은 다음 과 같다.
>>> one = MyClass()
>>> two = MyClass()
>>> one == two
True
>>> one is two
True
>>> id(one), id(two)
(4303862608, 4303862608)
(2)사용 모듈
사실 Python 의 모듈 은 천연의 단일 모드 입 니 다.모듈 이 처음 가 져 올 때 생 성 되 기 때 문 입 니 다. .pyc 파일 은 두 번 째 가 져 올 때 바로 불 러 옵 니 다. .모듈 코드 를 다시 실행 하지 않 고 pyc 파일 입 니 다.따라서 우 리 는 관련 함수 와 데 이 터 를 하나의 모듈 에 정의 하면 하나의 사례 대상 을 얻 을 수 있다.만약 우리 가 정말 하나의 예 류 를 원한 다 면 이렇게 하 는 것 을 고려 할 수 있다.
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
위의 코드 를 파일 mysingleton.py 에 저장 한 다음 이렇게 사용 합 니 다:
from mysingleton import my_singleton
my_singleton.foo()
admin 실행 프로 세 스<1>등 록 된 모든 app 의 admin.py 파일 을 반복 적 으로 불 러 옵 니 다.
def autodiscover():
autodiscover_modules('admin', register_to=site)
<2>실행 코드
#admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ("title",'publishDate', 'price')
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
<3> admin.site여기 서 사용 하 는 것 은 하나의 사례 모델 입 니 다.Admin Site 류 의 단일 사례 모델 에 대해 실 행 된 모든 app 중의 모든 admin.site 는 하나의 대상 입 니 다.
<4>register 방법 실행
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
class ModelAdmin(BaseModelAdmin):pass
def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)
여기까지,등록 완료!<5>admin 의 URL 설정
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
class AdminSite(object):
def get_urls(self):
from django.conf.urls import url, include
urlpatterns = []
# Add in each model's views, and create a list of valid URLS for the
# app_index
valid_app_labels = []
for model, model_admin in self._registry.items():
urlpatterns += [
url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
if model._meta.app_label not in valid_app_labels:
valid_app_labels.append(model._meta.app_label)
return urlpatterns
@property
def urls(self):
return self.get_urls(), 'admin', self.name
<6> url()방법의 확장 응용
from django.shortcuts import HttpResponse
def test01(request):
return HttpResponse("test01")
def test02(request):
return HttpResponse("test02")
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', ([
url(r'^test01/', test01),
url(r'^test02/', test02),
],None,None)),
]
확장 최적화
from django.conf.urls import url,include
from django.contrib import admin
from django.shortcuts import HttpResponse
def change_list_view(request):
return HttpResponse("change_list_view")
def add_view(request):
return HttpResponse("add_view")
def delete_view(request):
return HttpResponse("delete_view")
def change_view(request):
return HttpResponse("change_view")
def get_urls():
temp=[
url(r"^$".format(app_name,model_name),change_list_view),
url(r"^add/$".format(app_name,model_name),add_view),
url(r"^\d+/del/$".format(app_name,model_name),delete_view),
url(r"^\d+/change/$".format(app_name,model_name),change_view),
]
return temp
url_list=[]
for model_class,obj in admin.site._registry.items():
model_name=model_class._meta.model_name
app_name=model_class._meta.app_label
# temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
url_list.append(temp)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', (url_list,None,None)),
]
admin 의 url 경 로 를 모방 하여 배포 합 니 다.
#############models.py###########
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=32)
author = models.ForeignKey(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
#################admin.py###########
from app01.models import *
admin.site.register(Book)
admin.site.register(Author)
##############views.py################
from django.shortcuts import HttpResponse
def add(request):
return HttpResponse('add')
def change(request,id):
return HttpResponse('change')
def delete(request,id):
return HttpResponse('delete')
def show(request):
return HttpResponse('show')
################url.py##############
def get_urls2():
tmp = []
tmp.append(url(r'^add/',add))
tmp.append(url(r'^(\d+)/change/',change))
tmp.append(url(r'^(\d+)/delete/',delete))
tmp.append(url(r'^',show))
return tmp
def get_urls():
temp = []
for model, admin_class_obj in admin.site._registry.items():
model_name = model._meta.model_name
app_label = model._meta.app_label
temp.append(url(r'^{}/{}/'.format(app_label,model_name),(get_urls2(),None,None))) #[url(r'^app01/book/',),]
return temp
urlpatterns = [
url(r'^admin/', (get_urls(), None, None)),
url(r'^admin/', admin.site.urls),
]
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.