动态指定模型中的limit_choices_to

时间:2017-01-06 08:17:51

标签: python django

如果有必要限制另一个模型的字段,请你帮我理解限制选择如何在模型中起作用。 目前,我有两种模式:

组:

class Group(models.Model):
    name = models.CharField(max_length=10, null=True)
    leader = models.OneToOneField(
        'Student',
        related_name='+',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        limit_choices_to={'group': 2},
    )

和学生:

class Student(models.Model):

    group = models.ForeignKey(Group, on_delete=models.PROTECT)
    name = models.CharField(max_length=140, null=True)
    brd_date = models.DateField(null=True)
    ticket = models.IntegerField(null=True, unique=True)

所以你看到每个学生都有它的组(由ForeignKey配置)。 但每个团体可能有也可能没有自己的领导者。它只是一个特定的学生(由OneToOneField配置),他从他/她实际所属的组中选择。 在不受集团限制的情况下,可以选择每个学生作为每个群体的领导者。在提供的群组模型中,我设置了limit_choices_to选项,以限制仅针对第2组的选择(用于测试目的)。

是否可以动态设置此参数,因此可以根据组模型创建Form类,其中Group leader的选择只允许选择此特定组中的学生?

提前致谢。

1 个答案:

答案 0 :(得分:1)

只想分享适合我的方式。 我只是使用ModelForm类来限制我的选择:

class GroupForm(ModelForm):

    class Meta:
        model = Group
        fields = '__all__'

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

        self.fields['head'].queryset = Student.objects.filter(group=self.instance)

正如你在.filter(group = self.instance)的帮助下所看到的那样,我可以限制我的选择,并且有可能选择仅属于这个特定群体的学生。

然后只是:

class UpdateGroup(LoginRequiredMixin, UpdateView):
    model = Group
    form_class = GroupForm

我想有一种方法可以在模型级别上获得相同的结果,但我还没有找到它。