Django後臺admin的使用詳解

簡述:html

Django的admin能夠提供一個強大的後臺管理功能,能夠在web界面對數據庫進行操做,咱們須要修改admin.py將要操做的數據表註冊到後臺管理中.python

一,新建一個 名稱爲 zqxt_admin 的項目:web

?
1
django - admin.py startproject zqxt_admin

二,新建一個 叫作 blog 的app:數據庫

?
1
2
3
4
5
# 進入 zqxt_admin 文件夾
cd zqxt_admin
  
# 建立 blog 這個 app
python manage.py startapp blog

三,修改 blog 文件夾中的 models.py:django

?
1
2
3
4
5
6
7
8
9
10
# coding:utf-8
from django.db import models
  
  
class Article(models.Model):
     title = models.CharField(u '標題' , max_length = 256 )
     content = models.TextField(u '內容' )
  
     pub_date = models.DateTimeField(u '發表時間' , auto_now_add = True , editable = True )
     update_time = models.DateTimeField(u '更新時間' ,auto_now = True , null = True )

四,把 blog 加入到settings.py中的INSTALLED_APPS中:python3.x

?
1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = (
     'django.contrib.admin' ,
     'django.contrib.auth' ,
     'django.contrib.contenttypes' ,
     'django.contrib.sessions' ,
     'django.contrib.messages' ,
     'django.contrib.staticfiles' ,
  
     'blog' ,
)

五,同步全部的數據表:服務器

?
1
2
3
4
5
6
# 進入包含有 manage.py 的文件夾
python manage.py makemigrations
python manage.py migrate
  
注意:Django 1.6 .x 及如下的版本須要用如下命令
python manage.py syncdb

能夠看到:session

Creating tables ...app

Creating table django_admin_log函數

Creating table auth_permission

Creating table auth_group_permissions

Creating table auth_group

Creating table auth_user_groups

Creating table auth_user_user_permissions

Creating table auth_user

Creating table django_content_type

Creating table django_session

Creating table blog_article

 

You just installed Django's auth system, which means you don't have any superusers defined.

Would you like to create one now? (yes/no): yes

Username (leave blank to use 'tu'): tu

Email address: 

Password: 

Password (again): 

Superuser created successfully.

Installing custom SQL ...

Installing indexes ...

Installed 0 object(s) from 0 fixture(s)

若是是 Django 不主動提示建立管理員(Django 1.9不提示)用下面的命令建立一個賬號

?
1
python manage.py createsuperuser

六,修改 admin.py 

進入 blog 文件夾,修改 admin.py 文件(若是沒有新建一個),內容以下:

?
1
2
3
4
5
from django.contrib import admin
from .models import Article
  
  
admin.site.register(Article)

只須要這三行代碼,咱們就能夠擁有一個強大的後臺!

提示:urls.py中關於 admin的已經默認開啓,

七,打開 開發服務器:

?
1
2
python manage.py runserver
# 若是提示 8000 端口已經被佔用,能夠用 python manage.py runserver 8001 以此類推

訪問 http://localhost:8000/admin/ 輸入設定的賬號和密碼, 就能夠看到:

點擊 Articles,動手輸入 添加幾篇文章,就能夠看到:

咱們會發現全部的文章都是叫 Article object,這樣確定很差,好比咱們要修改,如何知道要修改哪一個呢?

咱們修改一下 blog 中的models.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# coding:utf-8
from django.db import models
  
  
class Article(models.Model):
     title = models.CharField(u '標題' , max_length = 256 )
     content = models.TextField(u '內容' )
  
     pub_date = models.DateTimeField(u '發表時間' , auto_now_add = True , editable = True )
     update_time = models.DateTimeField(u '更新時間' ,auto_now = True , null = True )
  
     def __unicode__( self ): # 在Python3中用 __str__ 代替 __unicode__
         return self .title

 咱們加了一個 __unicode__ 函數,刷新後臺網頁,會看到:

因此推薦定義 Model 的時候 寫一個 __unicode__ 函數(或 __str__函數)

技能提高:如何兼容python2.x和python3.x呢?

示例以下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding:utf-8
from __future__ import unicode_literals
  
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
  
@python_2_unicode_compatible
class Article(models.Model):
     title = models.CharField( '標題' , max_length = 256 )
     content = models.TextField( '內容' )
  
     pub_date = models.DateTimeField( '發表時間' , auto_now_add = True , editable = True )
     update_time = models.DateTimeField( '更新時間' ,auto_now = True , null = True )
  
     def __str__( self ):
         return self .title

python_2_unicode_compatible 會自動作一些處理去適應python不一樣的版本,本例中的 unicode_literals 可讓

python2.x 也像 python3 那個處理 unicode 字符,以便有更好地兼容性。

八,在列表顯示與字段相關的其它內容

後臺已經基本上作出來了,但是若是咱們還須要顯示一些其它的fields,如何作呢?

?
1
2
3
4
5
6
7
from django.contrib import admin
from .models import Article
  
class ArticleAdmin(admin.ModelAdmin):
     list_display = ( 'title' , 'pub_date' , 'update_time' ,)
  
admin.site.register(Article,ArticleAdmin)

list_display 就是來配置要顯示的字段的,固然也能夠顯示非字段內容,或者字段相關的內容,好比:

?
1
2
3
4
5
6
7
8
9
class Person(models.Model):
     first_name = models.CharField(max_length = 50 )
     last_name = models.CharField(max_length = 50 )
  
     def my_property( self ):
         return self .first_name + ' ' + self .last_name
     my_property.short_description = "Full name of the person"
  
     full_name = property (my_property)

  在admin.py中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.contrib import admin
from .models import Article, Person
  
  
class ArticleAdmin(admin.ModelAdmin):
     list_display = ( 'title' , 'pub_date' , 'update_time' ,)
  
  
class PersonAdmin(admin.ModelAdmin):
     list_display = ( 'full_name' ,)
  
admin.site.register(Article, ArticleAdmin)
admin.site.register(Person, PersonAdmin) 

到這裏咱們發現咱們又有新的需求,好比要改 models.py 中的字段,添加一個文章的狀態(草稿,正式發佈),這時候咱們就須要更改表,django 1.7之前的都不會自動更改表,咱們須要用第三方插件 South,參見 Django 遷移數據

Django 1.7 及以上用如下命令來同步數據庫表的更改:

?
1
2
python manage.py makemigrations
python manage.py migrate

其它一些經常使用的功能:

搜索功能:search_fields = ('title', 'content',) 這樣就能夠按照 標題或內容搜索了

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

 

篩選功能:list_filter = ('status',) 這樣就能夠根據文章的狀態去篩選,好比找出是草稿的文章

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

 

新增或修改時的佈局順序

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets

 

有時候咱們須要對django admin site進行修改以知足本身的需求,那麼咱們能夠從哪些地方入手呢?

如下舉例說明:

1.定製加載的列表, 根據不一樣的人顯示不一樣的內容列表,好比輸入員只能看見本身輸入的,審覈員能看到全部的草稿,這時候就須要重寫get_queryset方法:

?
1
2
3
4
5
6
7
class MyModelAdmin(admin.ModelAdmin):
     def get_queryset( self , request):
         qs = super (MyModelAdmin, self ).get_queryset(request)
         if request.user.is_superuser:
             return qs
         else :
             return qs. filter (author = request.user)

該類實現的功能是若是是超級管理員就列出全部的,若是不是,就僅列出訪問者本身相關的:

2.定製搜索功能(django 1.6及以上纔有)

?
1
2
3
4
5
6
7
8
9
10
11
12
class PersonAdmin(admin.ModelAdmin):
     list_display = ( 'name' , 'age' )
     search_fields = ( 'name' ,)
  
     def get_search_results( self , request, queryset, search_term):
         queryset, use_distinct = super (PersonAdmin, self ).get_search_results(request, queryset, search_term)
         try :
             search_term_as_int = int (search_term)
             queryset | = self .model.objects. filter (age = search_term_as_int)
         except :
             pass
         return queryset, use_distinct

queryset 是默認的結果,search_term 是在後臺搜索的關鍵詞

3.修改保存時的一些操做,能夠檢查用戶,保存的內容等,好比保存時加上添加人:

?
1
2
3
4
5
6
from django.contrib import admin
  
class ArticleAdmin(admin.ModelAdmin):
     def save_model( self , request, obj, form, change):
         obj.user = request.user
         obj.save()

其中obj是修改後的對象,form是返回的表單(修改後的),當新建一個對象時 change = False, 當修改一個對象時 change = True
若是須要獲取修改前的對象的內容能夠用:

?
1
2
3
4
5
6
7
from django.contrib import admin
  
class ArticleAdmin(admin.ModelAdmin):
     def save_model( self , request, obj, form, change):
         obj_original = self .model.objects.get(pk = obj.pk)
         obj.user = request.user
         obj.save()

那麼又有問題了,這裏若是原來的obj不存在,也就是若是咱們是新建的一個怎麼辦呢,這時候能夠用try,except的方法嘗試獲取,固然更好的方法是判斷一下這個對象是新建仍是修改,是新建就沒有 obj_original,是修改就有:

?
1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
  
class ArticleAdmin(admin.ModelAdmin):
     def save_model( self , request, obj, form, change):
         if change: # 更改的時候
             obj_original = self .model.objects.get(pk = obj.pk)
         else : # 新增的時候
             obj_original = None
  
         obj.user = request.user
         obj.save()

4, 刪除時作一些處理,

?
1
2
3
4
5
6
7
8
9
from django.contrib import admin
  
class ArticleAdmin(admin.ModelAdmin):
     def delete_model( self , request, obj):
         """
         Given a model instance delete it from the database.
         """
         # handle something here
         obj.delete()
相關文章
相關標籤/搜索