动态设置django的model field的默认值操作步骤


Posted in Python onMarch 30, 2020

问题背景

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的默认值操作步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
python3爬取各类天气信息
Feb 24 Python
python实现微信自动回复功能
Apr 11 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
Python查看微信撤回消息代码
Jun 07 Python
解决Python安装后pip不能用的问题
Jun 12 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
python能做哪些生活有趣的事情
Sep 09 Python
Django一小时写出账号密码管理系统
Apr 29 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 #Python
django 实现手动存储文件到model的FileField
Mar 30 #Python
解决django FileFIELD的编码问题
Mar 30 #Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 #Python
Django 删除upload_to文件的步骤
Mar 30 #Python
python with语句的原理与用法详解
Mar 30 #Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 #Python
You might like
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP常用函数小技巧
2008/09/11 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
js验证上传图片的方法
2015/05/12 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
最新奶茶店创业计划书
2014/01/25 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
Python包argparse模块常用方法
2021/06/04 Python
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技