指定django隐藏表单字段的默认值 - bone DRY?

时间:2010-12-14 05:43:12

标签: django django-forms dry django-queryset

所以让我们说在最后一刻(在视图中)我决定要为字段指定默认值并使其隐藏,如下所示:

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

我的问题是:我真的需要在这里指定queryset吗?我的意思是,从最初开始,我已经知道我正在谈论的椰子。为什么我还需要指定可用椰子的世界是这个特殊的燕子携带的椰子(由稻壳)?

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

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

3 个答案:

答案 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字段呢?