假设在最后一刻(在视图中)我决定为字段指定一个默认值并将其隐藏,如下所示:
form.fields['coconut'] = forms.ModelChoiceField(
label="",
widget=forms.HiddenInput(),
queryset=swallow.coconuts.all(),
initial=some_particular_coconut,
)
我的问题是:我真的需要在这里指定queryset吗?我的意思是,我已经知道,从initial,确切地说,我谈论的是哪个椰子,为什么我还需要指定可用椰子的宇宙是这个特定的燕子携带的椰子的集合(通过 shell )?
有什么方法可以避免指定queryset吗?简单的省略会导致django引发TypeError。
如果真的需要,这是不是有点潮湿?
3条答案
按热度按时间cx6n0qe31#
我认为stackoverflow的答案指向“正确”的做事方式是件好事,但越来越多的原始问题没有得到回答,因为用户试图做错误的事情。所以要直接回答这个问题,你可以这样做:
请注意传递给HiddenInput的命名参数,它非常笨拙,但却是原始问题的直接答案。
j8ag8udp2#
问题是你试图设置一个隐藏的ModelChoiceField,为了有一个Choice(传统上是下拉菜单),它需要知道它的Choices --这就是为什么你要给予一个queryset。
但是您并没有试图给予用户一个选择,对吗?这是一个隐藏的输入,并且您是从服务器设置它的(所以它可能会被POST回来)。
我的建议是尝试找到一种方法来避免使用隐藏输入。我发现它们有点笨拙。但是除此之外,为什么不直接用
some_particular_coconut.id
指定一个文本字段,然后隐藏它呢?反正模型只是 Package 那个id。8mmmxcuj3#
django需要一个queryset的原因是当你把字段呈现到页面上时,django只发送id。当它返回时,它需要知道queryset来重新膨胀那个对象。如果你在表单创建时就已经知道了queryset,为什么不简单地在你的视图中指定
form.fields['coconut'].initial = some_particular_coconut
,而把剩下的定义留在你的www.example.com中forms.py?如果您发现实际上只需要发送id(您不必在您的终端重新膨胀到对象),为什么不在char字段中发送它呢?