指定隐藏 ModelChoiceField 的默认值 (Django)

问题描述 投票:0回答:3

因此,假设在最后一刻(在视图中)我决定为字段指定默认值并将其隐藏,如下所示:

form.fields['coconut'] = forms.ModelChoiceField(
    label="", 
    widget=forms.HiddenInput(),
    queryset=swallow.coconuts.all(),
    initial=some_particular_coconut,
)

我的问题是:我真的需要在这里指定查询集吗? 我的意思是,我从一开始就知道我在谈论哪种椰子。 为什么我还需要指定可用椰子的宇宙是这只特定燕子(通过外壳)携带的椰子集合?

有没有办法可以避免指定查询集? 简单地省略会导致 django 引发 TypeError。

如果确实需要的话,这不是有点潮湿吗?

django django-forms dry django-queryset
3个回答
12
投票

我认为 stackoverflow 的答案指出了“正确”的做事方式,但越来越多的原始问题没有得到解答,因为用户试图做错误的事情。 因此,要直接回答这个问题,您可以这样做:

form.fields['coconut'] = forms.ModelChoiceField(label="", widget=forms.HiddenInput(attrs={'value':some_particular_coconut}), queryset=swallow.coconuts.all())

注意传递给 HiddenInput 的命名参数,它超级黑客,但它是对原始问题的直接答案。


3
投票

问题是您正在尝试设置隐藏的 ModelChoiceField。为了有一个选择(传统上是下拉菜单),它需要知道它的选择 - 这就是你给出查询集的原因。

但是您并不想给用户选择,对吗?这是一个隐藏的输入,您正在从服务器设置它(因此它大概会被发布回来)。

我的建议是尝试找到一种完全使用隐藏输入的方法。我觉得它们有点老套。但除此之外,为什么不直接用

some_particular_coconut.id
指定一个文本字段并隐藏它呢?无论如何,该模型仅包装该 id。


0
投票

django 需要查询集的原因是因为当你将字段渲染到页面时,django 只发送 id。当它返回时,它需要了解查询集才能重新膨胀该对象。 如果您在表单创建时已经知道查询集,为什么不在视图中简单地指定

form.fields['coconut'].initial = some_particular_coconut
并将其余定义保留在 forms.py 中?

如果您发现实际上只需要发送 id (您不必在最后重新膨胀为对象),为什么不在 char 字段中发送它?

© www.soinside.com 2019 - 2024. All rights reserved.