Cd Chen's Services

ba ba ba la~~

EditLockModelAdmin

最近在玩 Django,覺得他是一個不錯的 Framework。以前用 php 寫東西的時候,如果不搭配任何 Framework 時,總得自己處理所有的東西。現在透過 Django 就可以將寫程式的機會,降到最低,提高開發的速度。

舉例,Django 提供了一個名為 django.contrib.admin 的 module,可以快速的開發 Model 的管理介面。通常我們只需建立一個繼承自 django.contrib.admin.ModelAdmin 的類別即可:

from django.cotrib import admin    

class MyModelAdmin(admin.ModelAdmin):
      list_display = [ 'name', 'date', 'description' ]

admin.site.register(MyModel, MyModelAdmin)

不過,ModelAdmin 有個小小的遺憾。如果您的 Model 有一些欄位,希望在建立資料時,允許使用者可以輸入資料,而日後編輯時,只能讀取。那預設的 ModelAdmin 可能幫不上忙。所以,我寫了一個 EditLockModelAdmin:

class EditLockModelAdmin(admin.ModelAdmin):

    editlock_fields = []

    def get_form(self, request, obj = None, **kwargs):
        form = super(EditLockModelAdmin, self).get_form(request, obj, **kwargs)
        if obj:
            fields = form.base_fields
            for field in self.editlock_fields:
                if not field in fields:
                    continue
                fields[field].required = False
                fields[field].widget.attrs['disabled'] = 'disabled'
        return form

    def save_form(self, request, form, change):
        if change:
            exclude = getattr(form._meta, 'exclude', [])
            for editlock_field in self.editlock_fields:
                if not editlock_field in exclude:
                    exclude.append(editlock_field)
            form._meta.exclude = exclude

        return super(EditLockModelAdmin, self).save_form(request, form, change)

有興趣的朋友,可以試試看~~ :)

這篇內容的 Trackback 網址:

http://www.cdchen.idv.tw/trackback/987