最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django實現(xiàn)模型字段動態(tài)choice的操作

 更新時間:2020年04月01日 11:30:55   作者:wangjinyu124419  
這篇文章主要介紹了django實現(xiàn)模型字段動態(tài)choice的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

需求是根據(jù)當(dāng)前登錄用戶來顯示某個choice字段不同的選擇項。

先放現(xiàn)在的實現(xiàn)版本。

1、重寫PushRuleForm的__init__方法,

讓每次實例化PushRuleForm時,test_mode字段的choices根據(jù)用戶重新賦值

class PushRuleForm(forms.ModelForm):  
  def __init__(self, *args, **kwargs):
    if self.request.user.username in Const.TEST_USER_LIST:
      # 如果進(jìn)入都是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方法,進(jìn)入add和change頁面都會調(diào)用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(request, object_id, extra_context=extra_context)

mode.py對應(yīng)的代碼如下:

class PushRule(models.Model):  
  test_mode  = models.IntegerField(verbose_name='TestMode', default=0, choices=[(0,'OnLine'),(1,'Test')])

實現(xiàn)方式2:

,重寫PushRuleAdmin的render_change_form方法,傳入test_user_list上下文,通過js來判斷當(dāng)前用戶是否是測試用戶。

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))
  {
    $("#id_test_mode > option[value='0']").remove();
  }

html模板代碼:

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

<script> var username="{{ user.username }}", test_user_list="{{ test_user_list }}"</script>

不過這么的壞處是用戶列表信息直接暴露在前端代碼里了,跟直接在js里維護(hù)一個測試用戶列表一樣的效果,遂放棄這種做法

實現(xiàn)方式3:

后端寫一個視圖接口,返回對應(yīng)的test_user_list,js里寫一個ajax請求,來請求這個視圖獲取test_user_list

實測沒有問題。

實現(xiàn)方式4:

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

未實現(xiàn)的思路,想在PushRuleAdmin中直接修改model的test_mode字段的chioce選項,不過沒實現(xiàn),

想修改model的fields,不過發(fā)現(xiàn)他是一個ImmutableList類型,修改會報錯。

不過stackoverflow上的給出的這個方法不錯,可以參考,就是缺一個獲取用戶名的地方,哪天再看一下

補(bǔ)充知識:django 中優(yōu)雅的使用 choice 字段

問題

django中如何比較優(yōu)雅的對元組進(jìn)行標(biāo)記分類。可使用choice字段

choice字段

# models.py
class BookTagNum(object):
  OTHER = 1
  SCIENCE = 2
  SOCIAL_SCIENCES = 3
  ECONOMIC = 4
  COMPUTER = 5

class BOOK(models.Model):
  TAG_NUM_CHOICE = (
    (BookTagNum.OTHER, '其它'),
    (BookTagNum.SCIENCE, '科學(xué)類'),
    (BookTagNum.SOCIAL_SCIENCES, '社科類'),
    (BookTagNum.ECONOMIC, '經(jīng)濟(jì)類'),
    (BookTagNum.COMPUTER, '計算機(jī)類'),
  )
  tag = models.IntegerField(choices=TAG_NUM_CHOICE)

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

# view.py
def get(self, request):
 book = Book.obejects.filter(tag = BookTagNum.COMPUTER)

以上這篇django實現(xiàn)模型字段動態(tài)choice的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬蟲數(shù)據(jù)的分類及json數(shù)據(jù)使用小結(jié)

    Python爬蟲數(shù)據(jù)的分類及json數(shù)據(jù)使用小結(jié)

    這篇文章主要介紹了Python爬蟲數(shù)據(jù)的分類及json數(shù)據(jù)使用小結(jié),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python使用struct模塊實現(xiàn)打包/解包二進(jìn)制數(shù)據(jù)

    python使用struct模塊實現(xiàn)打包/解包二進(jìn)制數(shù)據(jù)

    因為網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)都是二進(jìn)制字節(jié)流,而?Python?只有字符串可以直接轉(zhuǎn)成字節(jié)流,對于整數(shù)、浮點數(shù)則無能為力了,所以?Python?提供了?struct?模塊來幫我們解決這一點,下面我們就來看看它的用法吧
    2023-09-09
  • 利用Python編寫一個簡單的緩存系統(tǒng)

    利用Python編寫一個簡單的緩存系統(tǒng)

    今天來做一個最簡單的例子,利用寫一個最簡單的緩存系統(tǒng),以key``value的方式保持?jǐn)?shù)據(jù),并且需要將內(nèi)容中的數(shù)據(jù)落地到文件,以便下次啟動的時候,將文件的內(nèi)容加載進(jìn)內(nèi)存中來,感興趣的可以了解一下
    2023-04-04
  • Python字符串與正則表達(dá)式詳細(xì)介紹

    Python字符串與正則表達(dá)式詳細(xì)介紹

    這篇文章主要介紹了Python字符串與正則表達(dá)式,Python字符串與正則表達(dá)式在Python中具有非常重要的地位,熟練的使用字符串與正則表達(dá)式能夠為我們的Python編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • 安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法

    安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法

    這篇文章主要介紹了安裝ElasticSearch搜索工具并配置Python驅(qū)動的方法,文中還介紹了其與Kibana數(shù)據(jù)顯示客戶端的配合使用,需要的朋友可以參考下
    2015-12-12
  • pandas創(chuàng)建series的三種方法小結(jié)

    pandas創(chuàng)建series的三種方法小結(jié)

    這篇文章主要介紹了pandas創(chuàng)建series的三種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python中多線程和多進(jìn)程的基本用法詳解

    Python中多線程和多進(jìn)程的基本用法詳解

    這篇文章介紹了 Python 中多線程和多進(jìn)程的相關(guān)知識,包括并發(fā)編程的優(yōu)勢,多線程和多進(jìn)程的概念、適用場景、示例代碼,線程池和進(jìn)程池的使用,以及如何選擇合適的并發(fā)方法,強(qiáng)調(diào)應(yīng)根據(jù)任務(wù)類型等因素綜合考慮,合理運(yùn)用以提升程序效率,需要的朋友可以參考下
    2025-02-02
  • python數(shù)據(jù)XPath使用案例詳解

    python數(shù)據(jù)XPath使用案例詳解

    xpath是最常用且最便捷高效的一種解析方式,通用型強(qiáng),其不僅可以用于python語言中,還可以用于其他語言中,數(shù)據(jù)解析建議首先xpath
    2021-09-09
  • python回調(diào)函數(shù)用法實例分析

    python回調(diào)函數(shù)用法實例分析

    這篇文章主要介紹了python回調(diào)函數(shù)用法,較為詳細(xì)的分析了常用的調(diào)用方式,并實例介紹了Python回調(diào)函數(shù)的使用技巧,需要的朋友可以參考下
    2015-05-05
  • requests庫post方法如何傳params類型的參數(shù)(最新推薦)

    requests庫post方法如何傳params類型的參數(shù)(最新推薦)

    在使用requests庫的post方法時,params類型的參數(shù)用于在URL中作為查詢字符串傳遞,與data或json參數(shù)不同,后者是放在請求體中的,params參數(shù)接受一個字典或包含鍵值對的序列,本文給大家介紹requests庫post方法怎么傳params類型的參數(shù),感興趣的朋友一起看看吧
    2025-03-03

最新評論

冷水江市| 台州市| 景洪市| 新和县| 铜川市| 平山县| 游戏| 乌苏市| 新龙县| 湖南省| 霍邱县| 建德市| 南川市| 齐齐哈尔市| 白沙| 德保县| 海城市| 洛川县| 光山县| 大丰市| 道真| 蚌埠市| 内黄县| 九台市| 叙永县| 若羌县| 江华| 崇文区| 深州市| 湛江市| 喀喇沁旗| 姚安县| 安远县| 永福县| 莎车县| 永吉县| 四子王旗| 奉化市| 阜宁县| 洛川县| 无为县|