django實現模型字段動態choice的操作

2022-10-04 14:36:26 字數 3082 閱讀 9181

需求是根據當前登入使用者來顯示某個choice欄位不同的選擇項。

先放現在的實現版本。

1、重寫pushruleform的__init__方法,

讓每次例項化pushruleform時,test_mode欄位的choices根據使用者重新賦值

class pushruleform(forms.modelform):

def __init__(self, *args, **kwargs):

if self.request.user.username in const.test_user_list:

# 如果進入都是add新增新項的頁面

if not kwargs.get('instance'):

# self.fields['test_mode'].initial = 1

self.fields['test_mode'].choices = [(1,'test')]

# else:

# self.fields['test_mode'].choices = [choice for choice in [(0,'online'),(1,'test')] if self.instance.test_mode in choice]

2、重寫pushruleadmin的changeform_view方法,進入add和change頁面都會呼叫changeform_view方法,都能讓form獲取request屬性,所以重寫這個方法比較好,pushruleform獲取request屬性後,form表單處理是就能通request.user.username取使用者名稱

class pushruleadmin:

form = pushruleform

def changeform_view(self, request, object_id=none, form_url='', extra_context=none):

self.form.request = request

return super(pushruleadmin, self).changeform_view(requewww.cppcns.comst, object_id, extra_context=extra_context)

mode.py對應的**如下:

class pushrule(models.model):

test_mode = models.integerfield(verbose_name='testmode', default=0, choices=[(0,'online'),(1,'test')])

實現方式2:

,重寫pushruleadmin的render_change_form方法,傳入test_user_list上下文,通過js來判斷當前使用者是否是測試使用者。

class pushruleadmin:

def render_change_form(self, request, context, add=false, change=false, form_url='', obj=none):

context['test_user_list']=const.test_user_list

return super(pushruleadmin, self).render_change_form(request, context, add=false, change=false, form_url='', obj=none)

js**:

if (test_user_list.includes(username))

html模板**:

為了讓js獲取django模板變數,先定義乙個username和test_user_list變數

不過這麼的壞處是使用者列表資訊直接暴露在前端**裡了,跟直接在js裡維護乙個測試用程式設計客棧戶列表一樣的效果,遂放棄這種做法

實現方式3:

後端寫乙個檢視介面,返回對應的test_user_list,js裡寫乙個ajax請求,來請求這個檢視獲取test_user_list

實測沒有問題。

實現方式4:

類似方法2,只不過不通過js來處理,直接通過django模板來處理,主要是重寫django/contrib/admin/templates/admin/includes/fieldset.html這個模板檔案,對django模板語法不太熟,遂放棄。

未實現的思路,想在pushruleadmin中直接修改model的test_mode欄位的chioce選項,不過沒實現,

想修改model的fields,不過發現他是乙個immutablelist型別,修改會報錯。

不過stackover程式設計客棧flow上的給出的這個方法不錯,可以參考,就是缺乙個獲取使用者名稱的地方,哪天再看一下

補充知識:django 中優雅的使用 choice 字段

問題django中如何比較優雅的對元組進行標記分類。可使用choice欄位

choice欄位

# models.py

class booktagnum(object):

other = 1

science = 2

social_sciences = 3

eoxyrrmgiconomic = 4

computer = 5

class book(models.model):

tag_num_choice = (

(booktagnum.other, '其它'),

(oxyrrmgibooktagnum.science, '科學類'),

(booktagnum.social_sciences, '社科類'),

(booktagnum.economic, '經濟類'),

(booktagnum.computer, '計算機類'),

) tag = models.integerfield(choices=tag_num_choice)

在**中盡量不要出現固定的硬編碼,比如某個判斷條件,判斷書的分類為:

# view.py

def get(self, request):

book = book.obejects.filter(tag = booktagnum.computer)

本文標題: django實現模型字段動態choice的操作

本文位址:

Django 模型字段 ImageField

class imagefield upload to none height field none width field none max length 100,options 從filefield繼承所有屬性和方法,但也會驗證上載的物件是否為有效影象。除了filefield可用的特殊屬性外,im...

django模型 欄位和選項

一 常用字段 1 字段型別 使用時需要引入django.db.models包,字段型別如下 autofield 自動增長的integerfield,通常不用指定,不指定時django會自動建立屬性名為id的自動增長屬性 booleanfield 布林字段,值為true或false nullboole...

Django現有模型增加字段

對於django已經存在的模型中需要增加乙個字段,如何實現?首先在model.py檔案中找到對應的模型名稱,加入需要增加的字段 找到新增加的字段的sql語句,記錄下來 再執行python manage.py shell 執行如下命令 from django.db import connection ...