<强>问题背景强>
django的模型领域需要动态设置默认值,具体案例如下:
原始代码如下,模型是应用程序,其中字段ignore_fort的默认值设置为假
类应用程序(TimestampedModel): name=模型。CharField (max_length=255, null=True) ignore_fort=models.BooleanField(默认=False)
然而现在有这样一个需求:违约需要根据某个变量ENV进行动态设置,如果ENV是UAT或者脂肪(不区分大小写,具体分支,比如uaT01也可以),则默认设置为真的,否则设置为假
首先想到的是如下代码:
类应用程序(TimestampedModel): name=模型。CharField (max_length=255, null=True) ignore_fort=模型。BooleanField(默认=' ENV.upper UAT除()或“脂肪”ENV.upper ())
通过python管理。py shell_plus启动壳调试,发现如果ENV本来设置的是什么值,逻辑正确,如果在shell中修改ENV的值,则新建的模型的ignore_fort值并不是根据当前ENV值进行设置,而是保持原来的值,达不到需求,例如,ENV值本来设置为uat,那么新建软件=程序(),打印app.ignore_fort结果是真的,修改ENV ENV=爸占绞俊?应用程序app1=();打印app1.ignore_fort结果还是真的,而我们需要的是假的。
<>强分析强>
官方描述如下:
字段的默认值。这是一个值或一个可调用对象。如果调用将被称为每次创建一个新对象。
如果想要在创建对象时动态修改默认的值,需要用可调用对象,可以理解为函数调用?
上述代码的默认值并不是可调用的对象,所以并不是在对象创建时同台更新。
参考正解如下,用一个函数调用实现可调用对象,进而实现动态跟新默认
def get_default_ignore_fort (): cur_env=ENV.upper () 返回任何(我在cur_env (“UAT”、“脂肪”)) 类应用程序(TimestampedModel): name=模型。CharField (max_length=255, null=True) ignore_fort=models.BooleanField(默认=get_default_ignore_fort) >之前<强> Django ModelChoiceField:过滤查询集并将默认值设置为对象强>
我有一个类Django形式定义喜欢这个在模型:
类AccountDetailsForm (forms.Form): … adminuser=forms.ModelChoiceField (queryset=User.objects.all ())这工作正常,但它有一些限制,我似乎不能解决:
(1)我想在查询集上使用一个过滤器,基于传递给表单的变量accountid,如下所示:
User.objects.filter(账户=accountid)
引用>这不能在模型中工作,因为accountid不能作为一个变量传递,当然。
因此,查询集必须以某种方式在视图中定义,但就我可以看到它是一个必需的字段在形成类。
(2)我想默认选择AccountDetailsForm数据库中的一个对象,我可以在视图中选择这样:
User.objects.filter(账户=accountid) .filter (primary_user=1)
引用>我试过指定adminuser作为默认值在窗体中,(它与其他标准表单字段,如CharField工作):
adminuser=User.objects.filter(账户=accountid) .filter (primary_user=1) … 形式=AccountDetailsForm ({adminuser: adminuser}) 返回render_to_response(“账户/编辑/accountdetails.html”, {“形式”:形式,“账户”:账户}) >之前但没有运气。
我应该使用除ModelChoiceField之外的其他方式给我这里需要的灵活性吗?
谢谢。
覆盖初始化方法并接受新的关键字参数
类AccountDetailsForm (forms.Form): … adminuser=forms.ModelChoiceField (queryset=User.objects.all ()) def __init__(自我,* args, * * kwargs): accountid=kwargs。流行(“accountid”,没有一个) 超级(AccountDetailsForm,自我)。__init__ (* args, * * kwargs) 如果accountid: self.fields [' adminuser ']。queryset=User.objects.filter(账户=accountid) 形式=AccountDetailsForm (accountid=3) >之前您可以随时在视图中手动设置选择。
形式=AccountDetailsForm ()
引用>
form.fields [' adminuser ']。queryset=User.objects.filter(账户=accountid)
警告:您不是通过将字典传递到您的示例中的表单来设置默认值。动态设置django的模型领域的默认值操作步骤