时间:2021-05-22
问题背景
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
补充知识: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的默认值操作步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
yii实现model添加默认值的方法(2种方法)这篇文章主要介绍了yii实现model添加默认值的方法,结合实例分析了在rules()方法及在beforeSav
由于项目需求,简单地写了一个input默认值设置,实现给.form中所有的input设置默认值的方法。input默认值设置$(function(){//集体调用
相信你一定会设置一个普通字段的默认值:classOffer(models.Model):salary=models.CharField(max_length=6
MySQL设置当前时间为默认值的问题我们经常会遇到,下面就为您介绍MySQL设置当前时间为默认值的实现全步骤,希望对您能有所启迪。数据库:test_db1创建表
我们使用Windows8如何还原系统图标默认值?确实年轻人喜欢个性化的电脑设置。设置以后想要恢复默认值,该怎么操作呢?下面我们就来看看详细的教程。1、首先,点击