Django 의 admin 구성 요소 의 사용 과 소스 분석 을 자세히 설명 합 니 다.

17286 단어 Djangoadmin
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),
]
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기