当前位置: 首页 > 面试题库 >

Django ModelChoiceField:过滤查询集并将默认值设置为对象

戈睿识
2023-03-14
问题内容

我有一个像这样定义的Django Form类Models

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

这项工作正常,但有一些限制,我似乎无法解决:

(1)我想基于accountid传递给表单的变量在queryset上使用过滤器,如下所示:

User.objects.filter(account=accountid)

当然,这在模型中不起作用,因为accountid不能将其作为变量传递。

因此,queryset必须以某种方式在中定义必须Views,但据我所知,它是Form类中的必填字段。

(2)我想AccountDetailsForm对数据库中的对象进行默认选择,可以这样选择Views

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)

警告:你不会通过将字典传递给示例中的形式来设置默认值。

你实际上是在创建绑定表,可能触发验证和所有爵士乐。

要设置默认值,请使用initials参数。

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


 类似资料:
  • 问题内容: 我正在运行一个非常简单的查询,但是对于某些结果,一个字段中的值为空。如果该值为null,如何将其设置为“字符串”? 就像是 它将在sql server 2005上运行 谢谢 问题答案: 使用以下内容: 或@Lieven指出: COALESCE的动态之处在于您可以定义更多的参数,因此,如果第一个为null,则获取第二个参数,如果第二个为null,则获取第三个,依此类推…

  • 问题内容: 有没有一种方法可以设置查询的模式,以便在其余查询中我可以仅按表名引用表,而无需在表名前添加表名? 例如,我想做这样的事情: 与此相反: 问题答案: 一个快速的谷歌把我指向了这个页面。它说明从sql server 2005开始,您可以使用ALTER USER语句设置用户的默认架构。不幸的是,这意味着您将对其进行永久更改,因此,如果需要在模式之间进行切换,则每次执行存储过程或一批语句时都需

  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 问题内容: 例如,如果component是一个复选框,则必须将其设置为false,或者是textfield,则必须清除文本。我正在尝试编写一种方法来重置中的所有组件。它必须像HTML表单中的reset函数一样工作。 如何将a重设为默认值? 问题答案: 一种可能的解决方法是创建自定义重置功能。重新初始化面板(您的表单)。 例如 创建一个自定义类来存储表单字段及其侦听器。 重新初始化面板组件将导致按@

  • 我在寻找一个选项来设置我的宇宙数据库收集TTL打开,但没有默认值。 这里我想在文档级别控制到期时间。我发现如果我在集合级别设置默认时间,它将覆盖文档级别中提到的时间。如果我错了,请纠正我。 基本上,我可以在数据资源管理器中设置它,但不确定如何通过C#代码进行设置。 由此https://docs.microsoft.com/en-us/azure/cosmos-db/time-to-live, 我看

  • 我在spring-boot项目中有一个properties类。 现在,我想将的application.properties文件中的其他属性设置默认值。与下面的示例使用@value所做的类似