【问题标题】:Best way to to create this field for my model为我的模型创建此字段的最佳方式
【发布时间】:2011-01-22 18:13:43
【问题描述】:

大家好,我刚开始使用 django,想知道如何在我的模型中执行以下行为:

class Game(models.Model)
  characters_count = models.IntegerField(default=1) #basically i set to a choice of 1-3

class Match(models.Model)
 video=models.ForeignKey(Game)
 p1char1 = models.ForeignKey(Character)
 p2char1 = models.ForeignKey(Character)
 p1char2 = models.ForeignKey(Character)
 p2char2 = models.ForeignKey(Character)
 p1char3 = models.ForeignKey(Character)
 p2char3 = models.ForeignKey(Character)

video 包含 Match 所依赖的实例游戏。

我需要创建一个约束,即所选角色来自给定游戏,并且每个玩家选择的角色数量也受游戏限制。

我应该在 Save 方法上执行此操作吗?或者我可以通过其他方式设置这些约束,以便模型将相应地生成表单,而无需手动执行。

对角色的限制(游戏中的)可以在模型的定义上做吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    对于您的角色,您应该与您的角色模型创建多对多关系。

    然后重写 Match save() 方法来限制选择的字符数。

    另一种方法是将此约束放在基于 match 的模型表单的 clean() 方法中:因此他们有一个列表可供选择(使用复选框列表小部件),如果他们选择了太多字符,表单将使用您将在 clean() 中输入的错误消息重新加载

    要根据游戏限制角色,您可以在角色和游戏之间添加另一个 M2M 关系 ('allowed_in_game'):在管理员中,您可以从游戏中选择角色。

    然后,在 Match Modelform 中,您必须修改 ModelchoiceField 显示字符以过滤它们以仅显示与当前游戏相关的字符。

    方法如下(borrowed from here):

    class Matchform(forms.ModelForm):
        class Meta:
            model = Match
    
         def __init__(self, game, *args, **kwargs):
             super(Matchform, self).__init__(*args, **kwargs)
             self.fields['character'].queryset = Character.objects.filter(allowed_in_game__in = game)
    

    然后您可以像这样调用修改后的 ModelForm:

    Matchform(game)
    Matchform(game,request.POST)
    Matchform(game,instance=m)
    

    您可以看到,每次添加“game”参数时,它都应该是一个 Game 对象才能让本示例工作。

    希望这会有所帮助....

    【讨论】:

    • 好吧,这听起来不错,但是限制可供选择的角色呢?我希望角色列表来自视频成员驱动的特定游戏。这属于 FormModel 还是我也可以在模型中这样做? (我可以在 save() 中检查它,但我想知道我是否还有其他事情可以做)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多