1. 程式人生 > 程式設計 >在django admin詳情表單顯示中新增自定義控制元件的實現

在django admin詳情表單顯示中新增自定義控制元件的實現

在開發中有需求在詳情顯示裡外鍵欄位內容,並且新增按鈕彈窗內容,以及按鈕跳轉內容。

以前並沒有做過相似的開發,我們的後臺是xadmin,當時正在研究xadmin的外掛,於是想著能不能用外掛去做,後來發現太麻煩,而且實現起來我也沒研究通,主要是新增按鈕之類的沒搞懂,於是就換了一種簡單的方法。

首先先講解下思路,admin中有幾個介面,一個是展示的list介面,一個是詳情的model介面,model中其實就是詳情detail,裡面記錄了此條資料的全部內容,精簡來說就是一個form表單的內容展示。

那麼知道了這個就好解決了,我們只需要在form.py裡新增對應的欄位即可。

form自帶了widget控制元件,比如我想在裡面新增一個按鈕,記錄使用者的積分消耗情況,那麼就可以在類名下直接新增:

from django.forms import widgets
class AForm(forms.ModelForm):
 point = forms.CharField(
    label=u"積分消耗情況",widget=widgets.TextInput(attrs={'class': '[你需要的css樣式]','value': '積分使用查詢','style': 'width:100px','type':'button'}),)

解釋下程式碼,首先匯入widgets類,在form中新增一個欄位,欄位中有一個widget引數,我們可以在其中設定控制元件,我在裡面添加了一個input型別,TextInput物件中的引數attrs傳入的是一個字典,我們可以在裡面像寫html一樣寫相關的css樣式。

這個時候我們就可以在詳情內看見button了,但是相對應的,在detail的表單中新增後,在add的表單中也會出現一個button,這個不是我們想要的,所以就要想辦法讓button只存在於detail介面中,這時我們需要重寫__init__方法:

def __init__(self,data=None,files=None,auto_id='id_%s',prefix=None,initial=None,error_class=ErrorList,label_suffix=None,empty_permitted=False,instance=None,use_required_attribute=None):
     if instance:
       pk = instance.pk
       if not initial:
         initial = {}
         // initial['point'] = [value]
         self.base_fields['point'].widget.input_type = 'button'
     else:
       self.base_fields['point'].widget.input_type = 'hidden'
     super(CustomerUserForm,self).__init__(data,files,auto_id,prefix,initial,error_class,label_suffix,empty_permitted,instance,use_required_attribute)

用super呼叫了__init__方法,instance就是建立後該條資料的例項,我們可以在其中判斷,如果instace存在的話,那麼獲取其中的id可以進行其他的操作,假如我們的point不是一個button,而是一個text格式的input,那麼我們就可以在[value]處新增我們想要獲取的值,並在attrs中將type改為hidden,可以看到我呼叫了一個self.base_fields[‘point']這個物件就是我們建立的button按鈕。

self.base_fields是一個字典,裡面添加了我們自定義的欄位(我記得是的,如果有誤可自行檢視),通過欄位name查詢出該欄位物件,掉用方法即可進行css樣式的修改。

當instance不存在時,也就意味著物件還沒有建立,我們此時正處於add介面,那麼就可以用self.base_fileds字典將widget物件取出,把type設定為hidden。

至此,我們的form新增額外欄位顯示以及button操作就完成了,還有最後一點,當type為text時我們直接新增value即可,type為button時,如果需要點選彈窗該如何操作。

我們可以重寫widgets.TextInput方法

class PointInput(widgets.TextInput):
  class Media:
    js = (
      'admin/js/customform.js',)
    css = {'all':'[csspath]'}

在media內部類中的js和css物件新增相應的靜態檔案即可。

而彈出視窗的值獲取可以在form中新增一個hidden欄位,value為我們想要獲取的值,在js中取值賦值即可。

補充知識:Django admin 列表每行後面新增稽核按鈕

我就廢話不多說了,還是直接看程式碼吧!

  def pass_audit_str(self):
    parameter_str = 'id={}&status={}'.format(str(self.id),str(self.audit))
    color_code = ''
    btn_str = '<a class="btn btn-xs btn-danger" href="{}" rel="external nofollow" >' \
         '<input name="通過稽核"' \
         'type="button" id="passButton" ' \
         'title="passButton" value="通過稽核">' \
         '</a>'
    return format_html(btn_str,'/pass_audit/?{}'.format(parameter_str))

pass_audit_str.short_description = '通過稽核'

在model類新增上面的方法和語句。

在admin類中的把 pass_audit_str 加入到list_display元組中

list_display = ('id','create_time','pass_audit_str',)

重新整理頁面即可;

以上這篇在django admin詳情表單顯示中新增自定義控制元件的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。