所以让我们说在最后一刻(在视图中)我决定要为字段指定默认值并使其隐藏,如下所示:
form.fields['coconut'] = forms.ModelChoiceField(label="", widget=forms.HiddenInput(), queryset=swallow.coconuts.all(), initial=some_particular_coconut)
我的问题是:我真的需要在这里指定queryset吗?我的意思是,从最初开始,我已经知道我正在谈论的椰子。为什么我还需要指定可用椰子的世界是这个特殊的燕子携带的椰子(由稻壳)?
有没有办法可以避免指定查询集?简单地省略导致django引发TypeError。
如果确实需要,这不是有点潮湿吗?
答案 0 :(得分:9)
我认为stackoverflow回答指向“正确”做事的方式是好的,但越来越多的原始问题没有得到回答,因为用户试图做错事。 所以直接回答这个问题就是你可以做的:
form.fields['coconut'] = forms.ModelChoiceField(label="", widget=forms.HiddenInput(attrs={'value':some_particular_coconut}), queryset=swallow.coconuts.all())
注意命名参数传递给HiddenInput,它的超级hackish但它直接回答了原始问题。
答案 1 :(得分:1)
问题是您正在尝试设置隐藏的ModelChoiceField。为了有一个选择(传统的下拉列表),它需要知道它的选择 - 这就是你给出一个查询集的原因。
但你不是想给用户一个选择,对吧?这是一个隐藏的输入,你从服务器设置它(所以它可能会被重新发布回来)。
我的建议是尝试找到一种方法来使用隐藏的输入。我发现他们有点hacky。但除此之外,为什么不用some_particular_coconut.id
指定一个文本字段,并隐藏它?无论如何,模型只包装了那个id。
答案 2 :(得分:0)
django需要查询集的原因是因为当您将字段呈现给页面时,django仅发送id。当它返回时,它需要知道查询集以重新膨胀该对象。
如果您在表单创建时已经知道了查询集,为什么不在视图中指定form.fields['coconut'].initial = some_particular_coconut
并将其余部分保留在forms.py中?
如果你发现你真的只需要发送id(你不必再为你的对象重新充气),为什么不把它发送到char字段呢?