前面講到admin界面用戶的注冊以及修改,如果我們注冊的用戶密碼忘記了該怎么辦呢
在終端輸入如下的命令進行重置
D:\django_test2>python manage.py shell
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.
IPython 5.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [2]: from django.contrib.auth.models import User
In [3]: user = User.objects.get(username='zhf')
(0.001) SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_
user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" = 'zhf'; args=('zhf',)
In [4]: user.set_password('xxxxx')
In [5]: user.save()
(0.000) BEGIN; args=None
(0.001) UPDATE "auth_user" SET "password" = 'pbkdf2_sha256$30000$ztylCxamAKb3$upNib9+1EAYRkMGwKESIsy7m6VIzsef0ioHsJYer3wQ=', "last_login" = '2017-12-10 13:53:11.655000', "is_superuser" = 1, "username" = 'zhf', "fi
rst_name" = '', "last_name" = '', "email" = 'maple412@163.com', "is_staff" = 1, "is_active" = 1, "date_joined" = '2017-12-10 13:34:59.874000' WHERE "auth_user"."id" = 1; args=(u'pbkdf2_sha256$30000$ztylCxamAKb3$up
Nib9+1EAYRkMGwKESIsy7m6VIzsef0ioHsJYer3wQ=', u'2017-12-10 13:53:11.655000', True, u'zhf', u'', u'', u'maple412@163.com', True, True, u'2017-12-10 13:34:59.874000', 1)
下面進入關鍵部分,前面只有用戶的信息,如何來監控我們自己定義的模塊呢。比如我們在models.py中定義的那些模型如何在后台顯示出來呢。我們先看下Django的文件結構,可以看到有一個admin.py的文件。這里就是我們對模型進行注冊的地方。
我們首先對這些模塊進行注冊,代碼如下
我們再來看下管理界面:可以看到已經增如如下的界面,里面有我們注冊的各個模塊
那么這些模塊的信息是否和我們之前已經創建過的一樣呢。我們拿book來舉例,點擊Book可以看到如下的用戶。
點擊其中的書名稱,即可以進去進行修改
我們可以通過管理界面的增加按鈕添加對應的模塊
如下圖所示:
這些選項和我們模板中的定義的都一樣。每一個都是必填項。如果我們添加的時候有一項沒有添加,則會報錯,如下,提示Address字段是必填項
那么我們怎么能修改某些項為非必填的呢。這需要在模板中修改定義。在address的具體定義中增加blank=True的描述,那么這項就變成了非必填項
可以看到address的顏色變成了灰色。
同樣的使用方法還有verbose_name字段,這個設置可以給這些項添加一個別名。如下address將會顯示為detail_address
address=models.CharField(max_length=40,blank=True,verbose_name='detail_address')
之前新增了一個author。點擊查看的時候除了能看到名字意外,其他如名字,郵件,和地址等信息都看不到。
如果我們想顯示出的信息,需要修改代碼如下。在admin.py中修改如下:
我們新增了一個顯示模板,只定義了一項,就是顯示名稱的元組。用於列表顯示。然后在register中新增了AuthorAdmin,這個可以理解為將AuthorAdmin模塊注冊到Author中去。
我們所有對於模板的顯示和自定義操作都可以在這里面進行重寫
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name','last_name','email','age')
list_editable = ('email','age')
admin.site.register(Author,AuthorAdmin)
從下面的解釋中可以看到,如果第二個參數沒有設置,那么模板將會繼續使用第一個參數的模板
我們現在來看下界面:可以看到增加了各個具體字段的顯示。並且email和age可以在線編輯修改。不用點擊進入具體模塊進行修改。
增加list_filter和serach_fields的定義。並會出現對應的過濾器框
list_filter=('age','email')
search_fields = ('age','email')
在輸入框中輸入對應的搜索字段,便可以得到對應的搜索結果
我們再繼續看下動作的定義:在默認的動作項中,只有刪除的動作。如果我們想有更多自定義的動作該如何操作呢
在AuthorAdmin中添加action的描述。Actions里面是具體的動作函數,在這里是save_excel
然后自定義的save_excel函數。並且攜帶request以及queryset的參數。其中request可以訪問的參數,可以用來區別用戶,queryset是author的查詢集合。save_excel.short_description用來命名在動作顯示的名字。
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name','last_name','email','age')
list_editable = ('email','age')
list_filter=('age','email')
search_fields = ('age','email')
actions = [u'save_excel']
def save_excel(self,request,queryset):
pass
save_excel.short_description = u'下載選中的數據'
這樣在動作中就有了我們自定義的action。
在后台的訪問中,有多個用戶都會登錄進來,那么我們想針對不同的用戶進行權限隔離,該如何操作呢。這里就要用到重寫changelist_view
首先我們增加一個非super權限的賬戶:
並且設置所有模型的添加,修改,刪除權限
添加后可以看到2個用戶。
在AuthorAdmin中定義changelist_view函數,通過request.user.is_superuser來判斷是否為超級用戶,並且對超級用戶和非超級用戶的顯示和編輯權限進行區分設置
def changelist_view(self, request, extra_context=None):
if request.user.is_superuser:
self.list_display = ('first_name','last_name','email','age')
self.list_editable = ('email','age')
self.list_filter=('age','email')
self.search_fields = ('age','email')
else:
self.list_display = ('email','age')
self.list_filter = ('email','age')
return super(AuthorAdmin, self).changelist_view(request, extra_context=None)
再次以zhf1的賬戶登錄,發現其中的顯示頁面以及可編輯頁面都已經和超級用戶不同。
我們來看另外一個模板,Book, 其中authors的定義是manytomanyFiled。這是什么意思呢,通俗理解就是多對多。就比如一本書的作者有多個不知一個的意思。
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
def __unicode__(self):
return self.name
如下在Authors的界面中可以看到2個之前新增的用戶
另外注意Publisher, 在模板中的定義是ForeignKey也就是數據庫中的外鍵。我們添加的時候會自動跳到Publisher的界面
可以看出django的后天可以方便我們對數據進行各種高效的管理,相比flask,django提供了各種各樣的模塊,更加方便我們對數據的處理。更多admin的用法請參考官方的介紹文檔