python初試五

chatGPT發表於2023-12-26

Django提供一個管理資料庫的app,即django.contrib.admin。這是Django最方便的功能之一。透過該app,我們可以直接經由web頁面,來管理我們的資料庫。這一工具,主要是為網站管理人員使用。


這個app通常已經預裝好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。


預設介面


admin介面位於[site]/admin這個URL。這通常在mysite/urls.py中已經設定好。比如,下面是我的urls.py:


from django.conf.urls import patterns, include, url


from django.contrib import admin


admin.autodiscover()                            # admin


urlpatterns = patterns('',

    url(r'^admin/', include(admin.site.urls)),  # admin

    url(r'^west/', include('west.urls')),

)


為了讓admin介面管理某個資料模型,我們需要先註冊該資料模型到admin。比如,我們之前在west中建立的模型Character。修改west/admin.py:


from django.contrib import admin

from west.models import Character


# Register your models here.

admin.site.register(Character)


訪問,登入後,可以看到管理介面:


這個頁面除了west.characters外,還有使用者和組資訊。它們來自Django預裝的Auth模組。我們將在以後處理使用者管理的問題。


複雜模型


管理頁面的功能強大,完全有能力處理更加複雜的資料模型。


先在west/models.py中增加一個更復雜的資料模型:


from django.db import models


# Create your models here.

class Contact(models.Model):

    name   = models.CharField(max_length=200)

    age    = models.IntegerField(default=0)

    email  = models.EmailField()

    def __unicode__(self):

        return self.name


class Tag(models.Model):

    contact = models.ForeignKey(Contact)

    name    = models.CharField(max_length=50)

    def __unicode__(self):

        return self.name


這裡有兩個表。Tag以Contact為外部鍵。一個Contact可以對應多個Tag。


我們還可以看到許多在之前沒有見過的屬性型別,比如IntegerField用於儲存整數。


同步資料庫:


$python manage.py syncdb


在west/admin.py註冊多個模型並顯示:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

admin.site.register([Character, Contact, Tag])


模型將在管理頁面顯示。


自定義頁面


我們可以自定義管理頁面,來取代預設的頁面。比如上面的"add"頁面。我們想只顯示name和email部分。修改west/admin.py:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    fields = ('name', 'email')


admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])


上面定義了一個ContactAdmin類,用以說明管理頁面的顯示格式。裡面的fields屬性,用以說明要顯示的輸入欄。我們沒有讓"age"顯示。由於該類對應的是Contact資料模型,我們在註冊的時候,需要將它們一起註冊。


我們還可以將輸入欄分塊,給每一塊輸入欄以自己的顯示格式。修改west/admin.py為:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    fieldsets = (

        ['Main',{

            'fields':('name','email'),

        }],

        ['Advance',{

            'classes': ('collapse',), # CSS

            'fields': ('age',),

        }]

    )


admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])


上面的欄目分為了Main和Advance兩部分。classes說明它所在的部分的CSS格式。這裡讓Advance部分收斂起來:


Advance部分旁邊有一個Show按鈕,用於展開。


Inline顯示


上面的Contact是Tag的外部鍵,所以有外部參考的關係。而在預設的頁面顯示中,將兩者分離開來,無法體現出兩者的從屬關係。我們可以使用Inline顯示,讓Tag附加在Contact的編輯頁面上顯示。


修改west/admin.py:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

class TagInline(admin.TabularInline):

    model = Tag


class ContactAdmin(admin.ModelAdmin):

    inlines = [TagInline]  # Inline

    fieldsets = (

        ['Main',{

            'fields':('name','email'),

        }],

        ['Advance',{

            'classes': ('collapse',),

            'fields': ('age',),

        }]


    )


admin.site.register(Contact, ContactAdmin)

admin.site.register([Character])


列表頁的顯示


在Contact輸入數條記錄後,Contact的列表頁看起來如下:


我們也可以自定義該頁面的顯示,比如在列表中顯示更多的欄目,只需要在ContactAdmin中增加list_display屬性:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    list_display = ('name','age', 'email') # list


admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])


我們還可以為該列表頁增加搜尋欄。搜尋功能在管理大量記錄時非常有用。使用search_fields說明要搜尋的屬性:


from django.contrib import admin

from west.models import Character,Contact,Tag


# Register your models here.

class ContactAdmin(admin.ModelAdmin):

    list_display = ('name','age', 'email') 

    search_fields = ('name',)


admin.site.register(Contact, ContactAdmin)

admin.site.register([Character])


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026630/viewspace-3001536/,如需轉載,請註明出處,否則將追究法律責任。

相關文章