亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

動態設置django的model field的默認值操作步驟

瀏覽:5日期:2024-10-16 14:08:33

問題背景

django的model field需要動態設置默認值,具體案例如下:

原始代碼如下,model是Application,其中字段ignore_fort的默認值設置為False

class Application(TimestampedModel): name = models.CharField(max_length=255, null=True) ignore_fort = models.BooleanField(default=False)

然而現在有這樣一個需求:default需要根據某個變量ENV進行動態設置,如果ENV是UAT或者FAT(不區分大小寫,具體分支,比如uaT01也可以),則default設置為True,否則設置為False

首先想到的是如下代碼:

class Application(TimestampedModel): name = models.CharField(max_length=255, null=True) ignore_fort = models.BooleanField(default= ’UAT’in ENV.upper() or ’FAT’ in ENV.upper())

通過python manage.py shell_plus啟動shell調試,發現如果ENV本來設置的是什么值,邏輯正確,如果在shell中修改ENV的值,則新建的model的ignore_fort值并不是根據當前ENV值進行設置,而是保持原來的值,達不到需求。例如,ENV值本來設置為uat,那么新建app = Application(),print app.ignore_fort結果是True,修改ENV ENV = ’hhh’,app1 = Application(); print app1.ignore_fort結果還是True,而我們需要的是False。

分析

官方描述如下:

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

如果想要在創建對象時動態修改default的值,需要用callable object,可以理解為函數調用?

上述代碼的default值并不是callable object,所以并不是在object創建時同臺更新。

解決方法

參考 正解如下,用一個函數調用實現callable object,進而實現動態跟新default

def get_default_ignore_fort(): cur_env =ENV.upper() return any(i in cur_env for i in (’UAT’, ’FAT’))class Application(TimestampedModel): name = models.CharField(max_length=255, null=True) ignore_fort = models.BooleanField(default=get_default_ignore_fort)

補充知識:Django ModelChoiceField:過濾查詢集并將默認值設置為對象

我有一個Django Form類定義喜歡這個在Models:

class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all())

這工作正常,但它有一些限制,我似乎不能解決:

(1)我想在查詢集上使用一個過濾器,基于傳遞給表單的變量accountid,如下所示:

User.objects.filter(account=accountid)

這不能在模型中工作,因為accountid不能作為一個變量傳遞,當然。

因此,查詢集必須以某種方式在視圖中定義,但就我可以看到它是一個必需的字段在Form類。

(2)我想默認選擇AccountDetailsForm數據庫中的一個對象,我可以在視圖中選擇這樣:

User.objects.filter(account=accountid).filter(primary_user=1)

我試過指定adminuser作為默認值在窗體中,(它與其他標準表單字段,如CharField工作):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1)...form = AccountDetailsForm({’adminuser’: adminuser})return render_to_response(’accounts/edit/accountdetails.html’, {’form’: form, ’account’:account})

但沒有運氣。

我應該使用除ModelChoiceField之外的其他方式給我這里需要的靈活性嗎?

謝謝。

覆蓋init方法并接受新的關鍵字參數

class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all()) def __init__(self, *args, **kwargs): accountid = kwargs.pop(’accountid’, None) super(AccountDetailsForm, self).__init__(*args, **kwargs) if accountid: self.fields[’adminuser’].queryset = User.objects.filter(account=accountid)form = AccountDetailsForm(accountid=3)

您可以隨時在視圖中手動設置選擇。

form = AccountDetailsForm()form.fields[’adminuser’].queryset = User.objects.filter(account=accountid)

警告:您不是通過將字典傳遞到您的示例中的表單來設置默認值。

你實際上創建了一個綁定表,可能觸發驗證和所有的爵士。

要設置默認值,use the initials argument.

form = AccountDetailsForm(initial={’adminuser’:’3’})

翻譯自:這里

以上這篇動態設置django的model field的默認值操作步驟就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 成在线人免费视频 | 在线观看高清免费 | 婷婷色青基地 | 春色精品视频在线播放 | 亚洲综合狠狠 | 欧美色碰碰碰免费观看长视频 | 96精品专区国产在线观看高清 | 国产色片在线观看 | 在线日韩麻豆一区 | 黄在线看 | 久久99精品视香蕉蕉 | 国产免费播放 | 99免费精品视频 | 成人网mm视频在线观看 | 欧美三级自拍 | 国产三级毛片视频 | 国产精品亚洲第一区二区三区 | 免费一级a毛片在线搐放正片 | 一级做a爰性色毛片免费 | 国产在线一区二区三区在线 | 九九99国产精品视频 | 亚洲国产影视 | 欧美日韩国产58香蕉在线视频 | 九九99视频在线观看视频观看 | 久久中文亚洲国产 | 国产在线精品一区二区三区不卡 | 国产成人综合网在线观看 | 欧美大片毛片aaa免费看 | 亚洲综合网在线 | 国产视频一区二区三区四区 | 欧美日韩免费一区二区在线观看 | 92国产福利午夜757小视频 | 99久热re在线精品99 6热视频 | 久久九九精品一区二区 | 欧美精品综合一区二区三区 | 19国产精品麻豆免费观看 | 欧美在线精品一区二区在线观看 | 欧美日韩乱码毛片免费观看 | 超91精品手机国产在线 | 永久免费人成网ww555kkk手机 | 亚洲成人xxx |