成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你應(yīng)該使用Django admin的9個(gè)理由

開(kāi)發(fā) 后端
雖然 Django admin 管理界面可以非常友好的用在 Django 項(xiàng)目的其它部分,它同樣可以很容易用于其它像傳統(tǒng)的數(shù)據(jù)庫(kù)或具有一個(gè)可怕的的管理界面的網(wǎng)站。而且這也是評(píng)估 Django 是否會(huì)滿足您的需求的最佳途徑。

[[192000]]

我現(xiàn)在要澄清這個(gè)誤解。Django 的 admin 絕對(duì)是軟件中的亮點(diǎn),可以有效的加速你的開(kāi)發(fā)。

這里有一些我能想到的很有用的 Django 的 admin 模塊的竅門(mén)。

(對(duì)于 Django admin 不太熟悉的人,先簡(jiǎn)單解釋幾個(gè)名詞)

  • Changeform 是可以編輯對(duì)象的頁(yè)面。
  • Changelist 頁(yè)面可以列出指定類型的對(duì)象。你可以指定過(guò)濾對(duì)象的條件及對(duì)對(duì)象的操作。點(diǎn)擊 changelist 里的對(duì)象一般會(huì)跳轉(zhuǎn)到對(duì)象的 changeform 頁(yè)面。

為了讓這些敲門(mén)更具可操作性,我們使用了與真實(shí)問(wèn)題幾乎一致的場(chǎng)景。假設(shè)我們有一個(gè)簡(jiǎn)單的網(wǎng)站,訪客可以上傳可愛(ài)的動(dòng)物圖片并進(jìn)行評(píng)論。這是不是很流行呢?

Tip 1:Django admin 后臺(tái)不限于用 Django 開(kāi)發(fā)的網(wǎng)站

雖然 Django admin 管理界面可以非常友好的用在 Django 項(xiàng)目的其它部分,它同樣可以很容易用于其它像傳統(tǒng)的數(shù)據(jù)庫(kù)或具有一個(gè)可怕的的管理界面的網(wǎng)站。而且這也是評(píng)估 Django 是否會(huì)滿足您的需求的***途徑。

你需要做的僅是:

  1. 在你的 Django 項(xiàng)目中建立一個(gè)新的應(yīng)用,并確保你已經(jīng)連接好傳統(tǒng)數(shù)據(jù)庫(kù) ,通過(guò) settings.py 文件中的 DATABASES 的設(shè)置。
  2. 將你的數(shù)據(jù)表定義為 Django 的模型。正如它的名字所表述的,manage.py inspectdb 是一個(gè)非常有用的命令:檢測(cè)現(xiàn)有的數(shù)據(jù)庫(kù),并打印出自動(dòng)生成的 Django 模型。
  3. 創(chuàng)建 admin.py 文件,并放在那里,唉,管理相關(guān)的。稍后將詳細(xì)說(shuō)明這個(gè)。

說(shuō)到我們的動(dòng)物“的網(wǎng)站,是由進(jìn)屎的腦袋寫(xiě)出來(lái)的,所以管理界面看起來(lái)像……你知道的,不是很好。為了解決這個(gè)問(wèn)題,我們通過(guò)幾個(gè) Django 模型重構(gòu)了數(shù)據(jù)庫(kù)結(jié)構(gòu),實(shí)現(xiàn)一個(gè)簡(jiǎn)單的管理界面:

  1. # models.py 
  2.  
  3. class Picture(models.Model): 
  4.  
  5.     DOG = 1 
  6.  
  7.     CAT = 2 
  8.  
  9.     ANIMAL_KIND_CHOICES = ( 
  10.  
  11.         (DOG, 'dog'), 
  12.  
  13.         (CAT, 'cat'), 
  14.  
  15.     ) 
  16.  
  17.   
  18.  
  19.     title = models.CharField(max_length=200) 
  20.  
  21.     author = models.ForeignKey(Author, related_name='pictures'
  22.  
  23.     animal_kind = models.IntegerField(choices=ANIMAL_KIND_CHOICES) 
  24.  
  25.     photo = models.ImageField(upload_to='animals'
  26.  
  27.     is_promoted = models.BooleanField(default=False
  28.  
  29.   
  30.  
  31. class Author(models.Model): 
  32.  
  33.     name = models.CharField(max_length=100) 
  34.  
  35.     email = models.EmailField() 
  36.  
  37.   
  38.  
  39. class Comment(models.Model): 
  40.  
  41.     author = models.ForeignKey(Author, related_name='comments'
  42.  
  43.     picture = models.ForeignKey(Picture, related_name='comments'
  44.  
  45.     comment = models.TextField() 
  46.  
  47.     editors_note = models.TextField() 
  48.  
  49.   
  50.  
  51. # admin.py 
  52.  
  53. class PictureAdmin(admin.ModelAdmin): 
  54.  
  55.     list_display_fields = ('photo''animal_kind''author''is_promoted', ) 
  56.  
  57.   
  58.  
  59. class AuthorAdmin(admin.ModelAdmin): 
  60.  
  61.     list_display_fields = ('name''email', ) 
  62.  
  63.   
  64.  
  65. class CommentAdmin(admin.ModelAdmin): 
  66.  
  67.     list_display_fields = ('picture''author', )  

Tip #2: 按你喜歡的方式篩選你的數(shù)據(jù)

很多人使用 Django admin 后臺(tái)對(duì)指定字段進(jìn)行篩選。要知道,把一個(gè)字段名放到 list_filter 列表里就可以了。同時(shí)它也非常容易地創(chuàng)建一個(gè)自定義過(guò)濾器!

假如最終你決定要推廣所有有 100+ 的帖子的作者。但是,我們?nèi)绾螀^(qū)分它們?讓我們創(chuàng)建一個(gè)過(guò)濾器,并把它添加到我們的變更列表。

  1. class ProductiveAuthorsFilter(admin.SimpleListFilter): 
  2.  
  3.     parameter_name = 'is_productive' 
  4.  
  5.     title = 'Productive author' 
  6.  
  7.     YES, NO = 1, 0 
  8.  
  9.   
  10.  
  11.     # Number of comments for an author to be considered a productive one 
  12.  
  13.     THRESHOLD = 100 
  14.  
  15.   
  16.  
  17.     def lookups(self, request, model_admin): 
  18.  
  19.         return ( 
  20.  
  21.             (self.YES, 'yes'), 
  22.  
  23.             (self.NO'no'), 
  24.  
  25.         ) 
  26.  
  27.   
  28.  
  29.     def queryset(self, request, queryset): 
  30.  
  31.         qs = queryset.annotate(Count('comments')) 
  32.  
  33.   
  34.  
  35.         # Note the syntax. This way we avoid touching the queryset if our 
  36.  
  37.         # filter is not used at all
  38.  
  39.         if self.value() == self.YES: 
  40.  
  41.             return qs.filter(comments__count__gte=self.THRESHOLD) 
  42.  
  43.         if self.value() == self.NO
  44.  
  45.             return qs.filter(comments__count__lt=self.THRESHOLD) 
  46.  
  47.   
  48.  
  49.         return queryset 
  50.  
  51.   
  52.  
  53. class PictureAdmin(admin.ModelAdmin): 
  54.  
  55.     list_filters = [..., ProductiveAuthorsFilter]  

現(xiàn)在,我們可以很容易地選出我們的核心作者。那么我們?nèi)绾伍_(kāi)始向他們推廣呢?讓我們進(jìn)入下一部分。

Tip #3:添加動(dòng)作(操作函數(shù))到 ‘actions’

這可是內(nèi)容管理者的天賜之物。還記得在每個(gè)模型的列表頂部的“動(dòng)作”工具欄不?我們是不是非常方便的先選擇一些圖片,然后只需單擊一下就“推廣”給作者了?現(xiàn)在讓我們來(lái)實(shí)現(xiàn)它:

  1. class PictureAdmin(admin.ModelAdmin): 
  2.  
  3.     actions = ['promote', ] 
  4.  
  5.   
  6.  
  7.     def promote(self, request, queryset): 
  8.  
  9.         queryset.update(is_promoted=True
  10.  
  11.         self.message_user(request, 'The posts are promoted'
  12.  
  13.     promote.short_description = 'Promote the pictures'  

就是這樣!不用再一個(gè)挨一個(gè)的打開(kāi)每個(gè)表單!另外,它很容易進(jìn)一步增加我們的動(dòng)作,例如,添加一個(gè)過(guò)渡表單。關(guān)于這點(diǎn),Django 文檔 有段非常棒的講解(https://docs.djangoproject.com/en/1.8/ref/contrib/admin/actions/#actions-that-provide-intermediate-pages)。

Tip #4: 搜索你需要的所有字段

好吧,過(guò)濾器是很酷,但讓我們關(guān)注了一下就搜索工具。在幾乎所有的安裝我見(jiàn)過(guò)的搜索框是用來(lái)在一個(gè)模型中的字段搜索。但是,當(dāng)你意識(shí)到它可以處理關(guān)系的 Django 搜索真正的亮點(diǎn)。因此,假設(shè)我們希望它在圖片“的標(biāo)題,作者姓名和注釋”文本進(jìn)行搜索。我們?nèi)绾巫龅竭@一點(diǎn)?

  1. class PictureAdmin(admin.ModelAdmin): 
  2.  
  3. search_fields = ('title''author__name''comments__text', )  

如果你的數(shù)據(jù)庫(kù)是夠大,不要忘記添加一些全文索引來(lái)增加搜索速度。

Tip #5: “在站點(diǎn)查看”的簡(jiǎn)單實(shí)現(xiàn)

在站點(diǎn)查看一個(gè)對(duì)象的界面是非常普及的需求,默認(rèn)情況下,你必須打開(kāi)該對(duì)象的表單,然后點(diǎn)擊按鈕“在站點(diǎn)查看”。以下代碼展示如何使此過(guò)程更容易一些:

  1. class PictureAdmin(admin.ModelAdmin): 
  2.  
  3.     list_fields = [..., 'object_link'
  4.  
  5.   
  6.  
  7.     def object_link(self, item): 
  8.  
  9.         url = item.get_absolute_url() 
  10.  
  11.         return u'<a href={url}>open</a>'.format(url=url) 
  12.  
  13.     object_link.short_description = 'View on site' 
  14.  
  15.     object_link.allow_tags = True  

這段代碼給列表中每個(gè)對(duì)象都添加了“在站點(diǎn)查看”的鏈接。在此,我們假定你的模型(Model)已經(jīng)實(shí)現(xiàn)了get_absolute_url()方法。如果還沒(méi)有 – 那現(xiàn)在就去實(shí)現(xiàn) ,這將為你節(jié)省很多時(shí)間。你也可能會(huì)想將這個(gè)片段轉(zhuǎn)移到一個(gè) mixin,或公用的 admin 基類。

Tip #6: 在列表頁(yè)就地編輯字段

假設(shè)我們需要給評(píng)論加一個(gè)編輯的備注。很自然,我們希望不需要對(duì)每條評(píng)論都去打開(kāi)評(píng)論的changeform。要做到這點(diǎn),我們可以稍微修改一下ModelAdmin:

  1. class CommentAdmin(admin.ModelAdmin): 
  2.  
  3. list_display_fields = ('picture''author''editors_note', ) 
  4.  
  5. list_editable = ('editors_note', )  

這樣就搞定了,現(xiàn)在打開(kāi)評(píng)論列表,可以按照需要進(jìn)行過(guò)濾,還可以在評(píng)論上即時(shí)添加備注。

Tip #7: 根據(jù)需要自定義 total 字段

每個(gè) changelist 最下方都有一行列出總數(shù)(total)。假設(shè)我們需要把貓和狗的圖片數(shù)量區(qū)分開(kāi)來(lái)。這個(gè)功能需要的代碼稍微多一些:我們需要重載 changelist 和 html 模板(更多內(nèi)容參考模板重載)。

  1. from django.contrib.admin.views.main import ChangeList 
  2.  
  3.   
  4.  
  5. class PicturesChangeList(admin.ChangeList): 
  6.  
  7.     def get_results(self, request): 
  8.  
  9.         super(PicturesChangeList, self).get_results(request) 
  10.  
  11.         totals = self.result_list.aggregate( 
  12.  
  13.             dogs_count=Sum(Case(When(animal_kind=Picture.DOG, then=1), 
  14.  
  15.                            output_field=IntegerField())), 
  16.  
  17.             cats_count=Sum(Case(When(animal_kind=Picture.CAT, then=1), 
  18.  
  19.                            output_field=IntegerField()))) 
  20.  
  21.         self.totals = totals 
  22.  
  23.   
  24.  
  25. class PictureAdmin(admin.ModelAdmin): 
  26.  
  27.     def get_changelist(self, request): 
  28.  
  29.         return PicturesChangeList  

模板的內(nèi)容:

  1. {% extends 'admin/change_list.html' %} 
  2.  
  3. {% block result_list %} 
  4.  
  5.     {{ block.super }} 
  6.  
  7.     <p> 
  8.  
  9.         There are 
  10.  
  11.         <strong> 
  12.  
  13.             {{ cl.totals.dogs_count|default:'none' }} dogs and 
  14.  
  15.             {{ cl.totals.cats_count|default:'none' }} cats 
  16.  
  17.         </strong> 
  18.  
  19.         on this page. 
  20.  
  21.     </p> 
  22.  
  23. {% endblock %}  

Tip #8: 對(duì)某些用戶只讀的 admin 界面

啥意思?假設(shè)你的祖母打算瞅一眼這些可愛(ài)的圖片,她站在你背后,覺(jué)得 Django 的 admin 界面挺有意思。不過(guò)你能肯定,她要是使用 admin 界面,恐怕一個(gè)按鈕的點(diǎn)擊就能毀掉整個(gè)網(wǎng)站。那么,我們加上 grandma-proof™,這樣就支持只讀的 admin 界面(就是某人說(shuō)的“數(shù)據(jù)瀏覽”):

  1. class GrandmaProofAdmin(admin.ModelAdmin): 
  2.  
  3.     def get_readonly_fields(self, request, obj=None): 
  4.  
  5.         if request.user.username == 'granny'
  6.  
  7.             return [f.name for f in self.model._meta.fields] 
  8.  
  9.         else
  10.  
  11.             return super(GrandmaProofAdmin, self).get_readonly_fields(request, obj) 
  12.  
  13.   
  14.  
  15. class PictureAdmin(GrandmaProofAdmin): 
  16. ...  

現(xiàn)在你可以安全的把修改圖片的權(quán)限放開(kāi)給你的祖母,這樣她就能瀏覽圖片列表。要注意這個(gè)方案肯定不能適用于所有使用場(chǎng)景,你還需要處理更多的情況。

Tip #9: 為每個(gè)對(duì)象自定義 action

有時(shí)候你需要在單個(gè)對(duì)象上執(zhí)行特定的 action。‘actions’工具當(dāng)然可以完成這個(gè)任務(wù),不過(guò)過(guò)程會(huì)顯得很麻煩:點(diǎn)擊對(duì)象、選擇 action、再點(diǎn)擊一個(gè)按鈕……肯定有更便捷的方式,對(duì)吧?讓我們想辦法只點(diǎn)擊一次就全部搞定。

這次我們要實(shí)現(xiàn)老祖母的另一個(gè)宏達(dá)的想法。她希望能給某些編輯發(fā) email,告訴他們她喜歡的所有圖片。

  1. class PictureAdmin(admin.ModelAdmin): 
  2.  
  3.     list_fields = (..., 'mail_link', ) 
  4.  
  5.   
  6.  
  7.     def mail_link(self, obj): 
  8.  
  9.         dest = reverse('admin:myapp_pictures_mail_author'
  10.  
  11.                        kwargs={'pk': obj.pk}) 
  12.  
  13.         return '<a href="{url}">{title}</a>'.format(url=dest, title='send mail'
  14.  
  15.     mail_link.short_description = 'Show some love' 
  16.  
  17.     mail_link.allow_tags = True 
  18.  
  19.   
  20.  
  21.     def get_urls(self): 
  22.  
  23.         urls = [ 
  24.  
  25.             url('^(?P<pk>\d+)/sendaletter/?$'
  26.  
  27.                 self.admin_site.admin_view(self.mail_view), 
  28.  
  29.                 name='myapp_pictures_mail_author'), 
  30.  
  31.         ] 
  32.  
  33.         return urls + super(PictureAdmin, self).get_urls() 
  34.  
  35.   
  36.  
  37.     def mail_view(self, request, *args, **kwargs): 
  38.  
  39.         obj = get_object_or_404(Picture, pk=kwargs['pk']) 
  40.  
  41.         send_mail('Feel the granny\'s love''Hey, she loves your pet!'
  42.  
  43.                   'granny@yoursite.com', [obj.author.email]) 
  44.  
  45.         self.message_user(request, 'The letter is on its way'
  46.  
  47.         return redirect(reverse('admin:myapp_picture_changelist'))  

但愿她現(xiàn)在能夠滿意?,F(xiàn)在每個(gè)對(duì)象字段加上了一個(gè)鏈接,讓她點(diǎn)一下就可以發(fā)送郵件。

Bonus Tip: 只需為 admin 添加一行代碼來(lái)減少查詢量

Django admin (Django 也是如此) 最常用也是最有用的技巧是 select_related。呃,你已經(jīng)都知道了?不就是把對(duì)象的名字傳給 ModelAdmin 的 list_select_related 屬性來(lái)實(shí)現(xiàn)相關(guān)對(duì)象的預(yù)加載嘛。但是,你知道你并沒(méi)有描述全部的相關(guān)對(duì)象嗎?只需要設(shè)置成 True,Django 就可以自動(dòng)預(yù)加載外部對(duì)象:

  1. class PictureAdmin(admin.ModelAdmin): 
  2.  
  3.     list_select_related = True  

本文到此就差不多結(jié)束了,希望你能覺(jué)得有意思。別忘了在評(píng)論里分享你的看法,告訴我們對(duì)你有幫助的技巧。 

責(zé)任編輯:龐桂玉 來(lái)源: Python開(kāi)發(fā)者
相關(guān)推薦

2021-08-09 14:47:34

Go語(yǔ)言開(kāi)發(fā)

2013-01-18 08:53:27

Android開(kāi)發(fā)學(xué)習(xí)Android

2016-07-22 15:22:52

2015-12-21 10:05:33

2017-12-02 23:23:21

云計(jì)算企業(yè)云存儲(chǔ)

2018-12-20 14:28:45

程序員開(kāi)源支付系統(tǒng)

2014-10-15 11:21:01

HTMLCSS

2009-09-07 13:25:34

NetBeansOracle

2017-01-22 12:41:02

CinnamonLinux桌面

2016-11-09 19:50:43

對(duì)象存儲(chǔ)AWS S3

2016-10-12 16:34:37

Linux操作系統(tǒng)

2020-03-07 15:25:38

TypeScript代碼開(kāi)發(fā)

2018-01-05 11:55:23

數(shù)據(jù)庫(kù)PostgreSQL

2023-05-26 21:22:05

2017-05-17 17:23:00

2023-11-03 00:28:44

ApacheFlink

2010-05-24 13:04:53

jQueryJavaScript

2012-10-11 10:43:26

開(kāi)發(fā)SQL

2018-09-03 11:00:09

2018-03-20 17:16:25

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品一区国产精品 | 日本在线观看网址 | 4h影视| 欧美狠狠操 | 国产精品揄拍一区二区 | 国产sm主人调教女m视频 | 欧美激情在线精品一区二区三区 | 草久免费视频 | 狠狠色狠狠色综合日日92 | 二区三区在线观看 | 国产99久久久国产精品 | 麻豆av一区二区三区久久 | 99re视频在线免费观看 | 国产精品成人久久久久 | 成人精品视频 | 一级一级毛片免费看 | 超碰520| 成人在线观看黄 | 中文字幕日韩三级 | 日韩欧美在线精品 | 精品欧美一区二区三区久久久 | 国产黄色大片在线免费观看 | 日韩免费一区二区 | 欧美v在线观看 | 亚洲 欧美 在线 一区 | 国产免国产免费 | 中文字幕第100页 | 欧美国产91 | 91xxx在线观看 | 极品粉嫩国产48尤物在线播放 | 亚洲伊人久久综合 | 久久精品视频网站 | 天堂一区二区三区四区 | 欧美操操操 | 亚洲精品乱码久久久久v最新版 | 久久天天躁狠狠躁夜夜躁2014 | 日韩在线观看一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 久久久av| 免费在线观看成人 | 天堂综合|