2010-12-14 31 views
3

因此,让我们在最后一分钟(视图)说,我决定我要指定一个默认的领域和隐藏它,就像这样:为django隐藏表单域指定默认值 - bone DRY?

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

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

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

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

回答

1

问题是你正试图设置一个隐藏的ModelChoiceField。为了有一个选择(传统上下拉),它需要知道它的选择 - 这就是为什么你给一个查询集。

但是你并没有试图给用户一个选择,对吧?这是一个隐藏的输入,你从服务器上设置它(所以它可能会被回发,据推测)。

我的建议是尝试找到一种方法来使用隐藏的输入。我发现他们有点冒险。但除此之外,为什么不只是指定一个文本字段some_particular_coconut.id,并隐藏它?无论如何,该模型只包装该ID。

+0

我深入了解这一点,我也认为这有点冒险。但这里的约定是什么?有些情况下会话可以满足要求,但我们假设这不是其中的一种。然后怎样呢?什么是一些主要的技术? – jMyles 2010-12-14 18:29:58

+0

嗯,我是会话粉丝,但是如果你有一个忙碌的webapp,我明白你想怎样避免它们。这听起来像是你试图将一个对象从浏览器“反弹”到另一个视图中......你为什么试图做到这一点?我会说上面的技巧是做这件事的最好方法,但是可能有更多优雅的方法来做任何你想做的事情...... – Robert 2010-12-16 01:34:12

0

django需要查询集的原因是因为当您将字段呈现给页面时,django仅发送该id。当它回来时,它需要知道查询集以便重新充气该对象。 如果您已经在表单创建时知道查询集,为什么不在您的视图中简单指定form.fields['coconut'].initial = some_particular_coconut,并将其余的定义保留在forms.py中?

如果你发现你真的只需要发送id(你不必在你的末尾重新膨胀到一个对象),为什么不发送它在char字段?

+0

但是这仍然没有DRY的意义 - 如果它有一个整数,并且该字段是一个外键,最后的区别是什么?换句话说,它总是*期望一个整数作为外键具有整数PK的字段值。 – jMyles 2010-12-14 18:29:00

+0

django知道这是来自模型的ForeignKey。另一方面,我只是在做EuropeanSwallowForm(request.POST)。椰子对EuropeanSwallow有一个外键。在处理程序视图中,django不知道我曾经在此期间隐藏了该字段。 – jMyles 2010-12-15 05:14:32

8

我认为stackoverflow的答案指向“正确”的做事方式是很好的,但越来越多的原始问题没有得到答复,因为用户试图做错事。 因此,要回答这个问题直接,这是你可以做什么:

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

公告指定的参数传递给HiddenInput,其超强的hackish,但其直接的回答原来的问题。