大家好

最近突然遇到一個需求
就是需要去修改python 的 django 的 wagtail  中的原生function功能
例如:
我想要修改會員後台列表的功能
增加顯示自定義欄位
與修改會員的時候可以順便修改該欄位
就這麼單純簡單的功能
 
但是所得到的答案是
如果是自己繼承後要再使用 或者是 "替換 model "
這是可以做到
 
但是要直接替換掉 class 的 function
基本上無法做到
 
而且糟糕的是
就算我替換了users model
wagtail 後台的功能與頁面也不會有變化
因為寫入欄位與模板都是固定的 (但是模板可以覆蓋,這還可以)
 
 
接著
我去看wagtail  的原始碼
例如這個功能在wagtail\users\views/ users.py 中
 
if form.is_valid():
    user = form.save()
 
    if user == request.user and 'password1' in form.changed_data:
        # User is changing their own password; need to update their session hash
        update_session_auth_hash(request, user)
 
    messages.success(request, _("User '{0}' updated.").format(user), buttons=[
        messages.button(reverse('wagtailusers_users:edit', args=(user.pk,)), _('Edit'))
    ])
    for fn in hooks.get_hooks('after_edit_user'):
        result = fn(request, user)
        if hasattr(result, 'status_code'):
            return result
    return redirect('wagtailusers_users:index')
else:
    messages.error(request, _("The user could not be saved due to errors."))
 
發現有留一個 hook 外掛事件
 
所以經過測試
只能使用 hook 來達成這種客製化需求了
 

## wagtail HOOK

例如在自己的 view裡面可以新增
@hooks.register('after_edit_user')
def before_create_page(request, user):
   
    try:
        SiteUserR = SiteUser.objects.get(user=user)
    except:
        SiteUserR = SiteUser()
        SiteUserR.user = user
    SiteUserR.note = request.POST.get('note','')
    SiteUserR.save()

  
 
所以儲存部分可以直接使用 hook 新增寫入
 
接著模板修改
在:
自己app siteuser\templates\wagtailusers\users
新增 edit.html 與 list.html
 
對應的是
wagtail\users\templates\wagtailusers\users 裡面檔案
 
就可以覆蓋原本 wagtail  的後台模板了
達成一點客製化功能
 
想一想
如果要在django 上面做一個高度客製化CMS平台
看來還是要自己開發比較實在...
 

"工作的意義在於幫助別人 -- 2017 日本輕井澤"