为 django 隐藏表单字段指定默认值 - 骨干?

Posted

技术标签:

【中文标题】为 django 隐藏表单字段指定默认值 - 骨干?【英文标题】:Specifying default value for django hidden form field - bone DRY? 【发布时间】:2011-05-25 02:07:22 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

我认为 *** 的答案指出了做事的“正确”方式是件好事,但由于用户试图做错事,因此越来越多的原始问题没有得到回答。 所以要直接回答这个问题,你可以这样做:

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

请注意传递给 HiddenInput 的命名参数,它超级骇人听闻,但它直接回答了原始问题。

【讨论】:

【参考方案2】:

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

但您并没有试图给用户一个选择,对吧?这是一个隐藏的输入,您正在从服务器设置它(所以它可能会被 POST 回来)。

我的建议是尝试找到一种完全使用隐藏输入的方法。我觉得他们有点hacky。但除此之外,为什么不直接用some_particular_coconut.id 指定一个文本字段,然后隐藏它呢?无论如何,模型只会包装该 id。

【讨论】:

我对此很感兴趣,而且我还认为这有点 hacky。但是这里的约定是什么?在某些情况下,一个会话就足够了,但让我们假设这不是其中之一。然后怎样呢?有哪些主要技术? 嗯,我是会话的粉丝,但如果你有一个繁忙的网络应用程序,我理解你想如何避免它们。听起来您正试图将一个对象从浏览器“弹回”到另一个视图中……您究竟为什么要这样做?我会说上述技术是做特定事情的最佳方式,但可能有更优雅的方式来做你想做的任何操作......【参考方案3】:

django 需要查询集的原因是因为当您将字段渲染到页面时,django 只发送 id。当它回来时,它需要查询集的知识才能重新膨胀该对象。 如果您在创建表单时已经知道查询集,为什么不在您的视图中简单地指定 form.fields['coconut'].initial = some_particular_coconut 并将其余定义留在您的 forms.py 中?

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

【讨论】:

但这仍然没有 DRY 意义 - 如果它有一个整数,并且该字段是一个外键,那到底有什么区别?换句话说,它总是期望一个整数作为外键具有整数 PK 的字段值。 django 知道它是模型中的 ForeignKey。另一方面,我只是在做 EuropeanSwallowForm(request.POST)。 Coconut 有一个指向 EuropeanSwallow 的外键。在处理程序视图中,django 不知道我曾经在中间隐藏了该字段。

以上是关于为 django 隐藏表单字段指定默认值 - 骨干?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个字段中的选择显示/隐藏 django 管理表单字段

隐藏或排除前端表单中的 ACF 字段并存储默认值

Django model.py表单的默认值 默认允许为空

有条件地显示和隐藏表单字段并设置字段值

根据值在 Admin 中自定义 Django 表单字段

Django:将模板值发布到视图