需求是根據當前登入使用者來顯示某個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 ...