动态设置django的模型领域的默认值操作步骤

  

<强>问题背景

  

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的模型领域的默认值操作步骤