django - 表单中的动态选择字段
Posted
技术标签:
【中文标题】django - 表单中的动态选择字段【英文标题】:django - dynamic select fields in forms 【发布时间】:2011-09-01 11:36:50 【问题描述】:我有一个名为 picks 的模型,它允许用户选择一个 nfl 球队(从静态列表中)。每当他们选择一个团队时,他们就不能再选择该团队,因此他们选择的任何团队都会减少选择的选择。 在我看来,我有一个函数可以计算出他们尚未选择哪些团队,但我无法弄清楚如何将此信息传递给表单。我在网上查看了许多表单示例,但还没有真正找到一个显示如何完成此操作的示例。从我读过的内容来看,似乎我应该从 forms.py 文件中调用此函数,但该函数需要作为参数传入的用户 ID 和联赛 ID,所以我宁愿只在模型中执行此操作。有人可以解释一下,或指出如何将选择字段选项从模型传递到表单的解释吗?
我在 Django 和 Python 方面都比较新,所以请原谅我在这里做的任何明显的疏忽。
谢谢!
编辑
好的,我想也许我在这里为这个问题提供了太多的非关键信息,我将在这里尝试简化问题:
我有一个创建表单的视图。表单中有一个选择框。我根据当前用户和启动视图的 URL 中的变量计算应该在视图内的选择框中输入的选项。我想知道如何将选择选项传递到表单中,或者如果这不是应该如何完成的。
我现在没有代码可以发布,但我真的认为它与问题无关。我希望我已经让它足够通用了。
【问题讨论】:
你想分享一些代码吗?例如,您的模型、表单以及您视图中的相关位。 【参考方案1】:您可以先定义没有动态字段的表单。在您的视图中创建它的实例后,您可以通过键入添加动态选择字段
form_instance.fields['your_field'] = ChoiceField(choices=list_of_two_tuples)
或使用 ModelChoiceField 并输入类似
form_instance.fields['your_field'] = ModelChoiceField(queryset=Teams.filter(...))
或者您可以使用here 中描述的类似但可能更简洁的机制。
【讨论】:
【参考方案2】:我认为最简单的方法是修改表单的查询集。 这个想法是排除您不想要的团队(因为他们已经被选中)。
假设您在Team
和User
之间有关系,请执行以下操作(在您看来)
form.fields['team'].queryset = Teams.objects.exclude(selected_by_user = user.id)
记住一件事:
Teams.objects.exclude(selected_by_user = user.id, date = datetime(2008, 12, 31))
将匹配未用户选择的团队并且不是来自 2008 年 12 月 31 日,而
Teams.objects.exclude(selected_by_user = user.id,).exclude(date = datetime(2008, 12, 31))
将匹配自 2008 年 12 月 31 日起用户或未选择的团队。
参考资料: Django Querysets (exclude filter)
【讨论】:
请看我的回答。查询集是您准确所需要的。以上是关于django - 表单中的动态选择字段的主要内容,如果未能解决你的问题,请参考以下文章