日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你應該使用Djangoadmin的9個理由

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

為阿拉善盟等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及阿拉善盟網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計、成都網(wǎng)站建設、阿拉善盟網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

這里有一些我能想到的很有用的 Django 的 admin 模塊的竅門。

(對于 Django admin 不太熟悉的人,先簡單解釋幾個名詞)

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

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

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

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

你需要做的僅是:

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

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

 
 
 
  1. # models.py
  2. class Picture(models.Model):
  3.     DOG = 1
  4.     CAT = 2
  5.     ANIMAL_KIND_CHOICES = (
  6.         (DOG, 'dog'),
  7.         (CAT, 'cat'),
  8.     )
  9.  
  10.     title = models.CharField(max_length=200)
  11.     author = models.ForeignKey(Author, related_name='pictures')
  12.     animal_kind = models.IntegerField(choices=ANIMAL_KIND_CHOICES)
  13.     photo = models.ImageField(upload_to='animals')
  14.     is_promoted = models.BooleanField(default=False)
  15.  
  16. class Author(models.Model):
  17.     name = models.CharField(max_length=100)
  18.     email = models.EmailField()
  19.  
  20. class Comment(models.Model):
  21.     author = models.ForeignKey(Author, related_name='comments')
  22.     picture = models.ForeignKey(Picture, related_name='comments')
  23.     comment = models.TextField()
  24.     editors_note = models.TextField()
  25.  
  26. # admin.py
  27. class PictureAdmin(admin.ModelAdmin):
  28.     list_display_fields = ('photo', 'animal_kind', 'author', 'is_promoted', )
  29.  
  30. class AuthorAdmin(admin.ModelAdmin):
  31.     list_display_fields = ('name', 'email', )
  32.  
  33. class CommentAdmin(admin.ModelAdmin):
  34.     list_display_fields = ('picture', 'author', ) 

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

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

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

 
 
 
  1. class ProductiveAuthorsFilter(admin.SimpleListFilter):
  2.     parameter_name = 'is_productive'
  3.     title = 'Productive author'
  4.     YES, NO = 1, 0
  5.  
  6.     # Number of comments for an author to be considered a productive one
  7.     THRESHOLD = 100
  8.  
  9.     def lookups(self, request, model_admin):
  10.         return (
  11.             (self.YES, 'yes'),
  12.             (self.NO, 'no'),
  13.         )
  14.  
  15.     def queryset(self, request, queryset):
  16.         qs = queryset.annotate(Count('comments'))
  17.  
  18.         # Note the syntax. This way we avoid touching the queryset if our
  19.         # filter is not used at all.
  20.         if self.value() == self.YES:
  21.             return qs.filter(comments__count__gte=self.THRESHOLD)
  22.         if self.value() == self.NO:
  23.             return qs.filter(comments__count__lt=self.THRESHOLD)
  24.  
  25.         return queryset
  26.  
  27. class PictureAdmin(admin.ModelAdmin):
  28.     list_filters = [..., ProductiveAuthorsFilter] 

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

Tip #3:添加動作(操作函數(shù))到 ‘a(chǎn)ctions’

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

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

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

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

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

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

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

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

在站點查看一個對象的界面是非常普及的需求,默認情況下,你必須打開該對象的表單,然后點擊按鈕“在站點查看”。以下代碼展示如何使此過程更容易一些:

 
 
 
  1. class PictureAdmin(admin.ModelAdmin):
  2.     list_fields = [..., 'object_link']
  3.  
  4.     def object_link(self, item):
  5.         url = item.get_absolute_url()
  6.         return u'open'.format(url=url)
  7.     object_link.short_description = 'View on site'
  8.     object_link.allow_tags = True 

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

Tip #6: 在列表頁就地編輯字段

假設我們需要給評論加一個編輯的備注。很自然,我們希望不需要對每條評論都去打開評論的changeform。要做到這點,我們可以稍微修改一下ModelAdmin:

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

這樣就搞定了,現(xiàn)在打開評論列表,可以按照需要進行過濾,還可以在評論上即時添加備注。

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

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

 
 
 
  1. from django.contrib.admin.views.main import ChangeList
  2.  
  3. class PicturesChangeList(admin.ChangeList):
  4.     def get_results(self, request):
  5.         super(PicturesChangeList, self).get_results(request)
  6.         totals = self.result_list.aggregate(
  7.             dogs_count=Sum(Case(When(animal_kind=Picture.DOG, then=1),
  8.                            output_field=IntegerField())),
  9.             cats_count=Sum(Case(When(animal_kind=Picture.CAT, then=1),
  10.                            output_field=IntegerField())))
  11.         self.totals = totals
  12.  
  13. class PictureAdmin(admin.ModelAdmin):
  14.     def get_changelist(self, request):
  15.         return PicturesChangeList 

模板的內(nèi)容:

 
 
 
  1. {% extends 'admin/change_list.html' %}
  2. {% block result_list %}
  3.     {{ block.super }}
  4.     

  5.         There are
  6.         
  7.             {{ cl.totals.dogs_count|default:'none' }} dogs and
  8.             {{ cl.totals.cats_count|default:'none' }} cats
  9.         
  10.         on this page.
  11.     

  12. {% endblock %} 

Tip #8: 對某些用戶只讀的 admin 界面

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

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

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

Tip #9: 為每個對象自定義 action

有時候你需要在單個對象上執(zhí)行特定的 action?!產(chǎn)ctions’工具當然可以完成這個任務,不過過程會顯得很麻煩:點擊對象、選擇 action、再點擊一個按鈕……肯定有更便捷的方式,對吧?讓我們想辦法只點擊一次就全部搞定。

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

 
 
 
  1. class PictureAdmin(admin.ModelAdmin):
  2.     list_fields = (..., 'mail_link', )
  3.  
  4.     def mail_link(self, obj):
  5.         dest = reverse('admin:myapp_pictures_mail_author',
  6.                        kwargs={'pk': obj.pk})
  7.         return '{title}'.format(url=dest, title='send mail')
  8.     mail_link.short_description = 'Show some love'
  9.     mail_link.allow_tags = True
  10.  
  11.     def get_urls(self):
  12.         urls = [
  13.             url('^(?P\d+)/sendaletter/?$',
  14.                 self.admin_site.admin_view(self.mail_view),
  15.                 name='myapp_pictures_mail_author'),
  16.         ]
  17.         return urls + super(PictureAdmin, self).get_urls()
  18.  
  19.     def mail_view(self, request, *args, **kwargs):
  20.         obj = get_object_or_404(Picture, pk=kwargs['pk'])
  21.         send_mail('Feel the granny\'s love', 'Hey, she loves your pet!',
  22.                   'granny@yoursite.com', [obj.author.email])
  23.         self.message_user(request, 'The letter is on its way')
  24.         return redirect(reverse('admin:myapp_picture_changelist')) 

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

Bonus Tip: 只需為 admin 添加一行代碼來減少查詢量

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

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

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


分享標題:你應該使用Djangoadmin的9個理由
分享URL:http://www.dlmjj.cn/article/cdssdsc.html