我可以使用默认查询集创建自定义django modelchoicefield

时间:2012-12-08 17:18:29

标签: django django-forms django-models

我有一个带有follow_by字段的订单模型:

class order(models.Model):
   followed_by = models.ForeignKey(User, limit_choices_to={'groups__name': "Managers"})

我为这些模型提供了几个这样的模型和表格。默认情况下,表单会显示一个modelchoicefield,其中列出了作为管理员的用户。这可以。但显示效果并不好:它提供了用户名,我想要第一个+姓氏。这很好用:Change Django ModelChoiceField to show users' full names rather than usernames

除了现在在everyform中我必须声明查询集以限制用户到管理员。我可以使用上面的方法,以便自定义modelchoicefield默认为我的筛选查询集。所以我可以从一个表格中说出:

followed_by = ManagerUserModelChoiceField()

3 个答案:

答案 0 :(得分:0)

您可以在ModelChoiceField子类上定义查询集吗?

class UserModelChoiceField(ModelChoiceField):
    # Query that returns set of valid choices
    queryset = User.objects.filter(group__name='Managers')
    def label_from_instance(self, obj):
        return obj.get_full_name()

答案 1 :(得分:0)

尝试将查询集作为参数传递给ManagerUserModelChoiceField类。

followed_by = ModelChoiceField(queryset = User.objects.filter(groups__name="Managers")

答案 2 :(得分:0)

在我对@Enrico的评论之后,我想到了这个想法:我覆盖了" init"我的自定义字段上的类如下:

class UserModelChoiceField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        super(UserModelChoiceField, self).__init__(queryset=User.objects.filter(groups__name="Managers"), *args, **kwargs)

我以前在python中看过这样的事情,但我是python的新手,所以我不确定这是不是坏事,或者我是否应该以某种方式改善它?我很感激一些反馈。话虽如此,它似乎工作正常。