基于另一个字段的Django ModelForm字段queryset

考虑我的models.py

PowerPolicy

class PowerPolicy(models.Model):
    name = models.CharField(max_length=15)
    ...

class Group(models.Model):
   name = models.CharField(max_length=15)
   #But then,we also have:
   power_policies = models.ManytoManyField(PowerPolicy)


播放器

class Player(models.Model):
    name = models.CharField(max_length=15)
    group = models.ForeignKey(Group,on_delete=models.CASCADE)
    ...

然后另一个模型叫做
UsePower

class UserPower(models.Model):
    player = models.ForeignKey(Player,on_delete=models.CASCADE)
    power_policy = models.ForeignKey(PowerPolicy,on_delete=models.CASCADE)
    ...

但是!这很重要:我要做到这一点,以便我的超级用户 (请注意,我的超级用户不是玩家,他只是超级用户)只能创建UsePower的{​​{1}}中指定的Power个对象的Player对象。现在,我确实知道我必须创建一个自定义表单并覆盖返回的Group字段的queryset,即通过函数根据我的需要我的自定义查询集。
-看起来像这样:

power_policy

然后通过以下操作在管理网站上使用它:

class UsePowerForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):
        super(UsePowerForm,self).__init__(*args,**kwargs)

        def MyCustomFunctionThatReturnsTheQuerySet():
            This function returns the Power policies that are allowed to the player in
            their player Group. The only problem is,Our little function here doesn't know how to get the player chosen.
                could you help
            return TheQuerySet

        self.fields['power_policy'].queryset = MyCustomFunctionThatReturnsTheQuerySet()

我真的希望这很有意义,你们可以帮助我。

谢谢您的阅读,老实说,我对此表示感谢。

编辑:对我来说,无法使用表单清理或在保存过程中进行验证:(

jlcust 回答:基于另一个字段的Django ModelForm字段queryset

您可以在初始化表单时获取播放器:

class UserPowerForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):
        super(UsePowerForm,self).__init__(*args,**kwargs)

        player = Player.objects.get(id=self.initial['player'])

        ###from here you can use player to get the power policies and put into list

        self.fields['power_policy'] = forms.ChoiceField(choices=power_policy_list)


    class Meta:
        model = UserPower
        fields = ['player','power_policy']
本文链接:https://www.f2er.com/3156566.html

大家都在问