Django表单模型和编辑

时间:2009-12-23 19:34:43

标签: django forms django-models

哇,我在这方面遇到了很多困难。我必须做错事,我得到了令人难以置信的大量疑问。

所以,我的模型如下: 播放机 氏族 匹配(如在比赛中) MatchMap(匹配的地图) MatchPlayer(比赛的球员)

所有这些都是通过外键关联,没有m2m关系。一名球员可以在一个战队中,一场比赛涉及两个战队。一场比赛可以有任意数量的地图,并且只有来自两个部落的球员可以参加比赛(虽然将来球员可能不会在同一场比赛中进行比赛,所以我指定了他们在比赛中出场的一方。匹配)。

所以,我做了提交比赛,一切都好。但是要编辑这些信息,这就是问题! 为了编辑匹配的MatchPlayers,我尝试使用inlineformset_factory

PlayersFormSet = inlineformset_factory(MatchBetweenClans, MatchPlayer)
playersForms = PlayersFormSet(instance=match)

这已经开始了,因为对于匹配中的每个玩家实例,Django命中数据库并获得所有玩家的列表。如果例如6个玩家参加比赛,并且我有inlineformset_factory提供的2个空表格,我会在日志中看到

SELECT
 ...
FROM
 `accounts_customuser`

8次。

现在,即使这对我来说工作正常,它也不能满足我的需要。当将球员添加到比赛时,并非所有球员都应该在列表中,只有来自2个指定部落的球员,理想情况下是复选框的形式(每个复选框都是一个战队的球员)。提交比赛时,这很容易做到:

clan1PlayerList = CustomUser.objects.filter(clan=clan1Instance)
clan2PlayerList = CustomUser.objects.filter(clan=clan2Instance)
playersClan1 = forms.ModelMultipleChoiceField(queryset=clan1PlayerList, label="Jogadores - "+clan1Instance.tag+"", widget=forms.CheckboxSelectMultiple(attrs={'class':'input_checkbox'}))
playersClan2 = forms.ModelMultipleChoiceField(queryset=clan2PlayerList, label="Jogadores - "+clan2Instance.tag, widget=forms.CheckboxSelectMultiple(attrs={'class':'input_checkbox'}))

无论如何,我可以在处方集上编辑这个吗?我找不到一种方法来将一个战队的球员名单和比赛的当前球员发送给一个表格。 感谢

1 个答案:

答案 0 :(得分:3)

您可能需要查看select_related

Here are the docs.


我不得不再次阅读你的问题,因为问题的一部分对我来说并不清楚。我认为你遇到了太多查询到数据库的问题(也可能是一个问题,选择相关会有帮助),但你的问题确实是:

如何过滤表单字段以仅允许基于其他字段的值?

正确?从你的问题:

  

在比赛中添加玩家时,并非所有玩家都应该在列表中,只有来自2个指定部落的玩家,理想情况下是复选框的形式(每个复选框都是战队的玩家)。

在您的视图中,按片段过滤每个表单上的字段。类似的东西(没有你的模型,我只能猜到字段名称):

form.fields['player'].queryset=form.fields['player'].queryset.filter(clan__in=list_of_selected_clans)

无关建议: look at python's string interpolation

Boa sorte!