django - 表单中的动态选择字段

时间:2011-05-25 05:57:13

标签: django django-forms django-select-related

我有一个名为picks的模型,允许用户选择nfl团队(来自静态列表)。每当他们选择一个团队时,他们就不能再选择那个团队,因此他们选择的任何团队都会减少选择。 我有一个功能,我在我的视图中调用,找出他们尚未选择的团队,但我无法弄清楚如何将这些信息传递给表单。我在网上查看了很多表单示例,但还没有真正找到一个展示如何实现这一点的表单示例。从我所看到的,似乎我应该从forms.py文件中调用此函数,但该函数需要将用户ID和联盟ID作为参数传入,所以我宁愿在模型中执行此操作。有人可以解释一下,或者给我一个解释,说明如何将选择字段选择从模型传递到表单吗?

我在Django和Python方面都比较新,所以请原谅我在这里做的任何明显的疏忽。

谢谢!

修改

好吧,我想也许我在这里给出了太多关于这个问题的非关键信息,我会试着在这里简化这个问题:

我有一个创建表单的视图。表单中有一个选择框。我根据当前用户和启动视图的URL中的变量,计算应该在视图内部的选择框中的选项。我想知道如何将选择选项传递到表单中,或者如果不是这样的话。

我目前没有代码在我面前发布,但我真的不认为这与问题有关。我希望我已经足够通用了。

2 个答案:

答案 0 :(得分:0)

我认为最简单的方法是修改表单的查询集。 我们的想法是排除您不想要的团队(因为他们已经被选中)。

假设您与TeamUser之间存在关联,请执行以下操作(在您的视图中)

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))

将匹配用户选择的团队 AND 不是来自2008年12月31日,而

Teams.objects.exclude(selected_by_user = user.id,).exclude(date = datetime(2008, 12, 31))

将匹配用户 OR 从2008年12月31日开始未提取的小组。

参考文献: Django Querysets (exclude filter)

答案 1 :(得分:0)

您可以先定义没有动态字段的表单。在视图中创建实例后,可以通过键入

添加动态选择字段
form_instance.fields['your_field'] = ChoiceField(choices=list_of_two_tuples)

或使用ModelChoiceField并输入类似

的内容
form_instance.fields['your_field'] = ModelChoiceField(queryset=Teams.filter(...))

或者您可以使用here描述的类似但可能更清晰的机制。