首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django表单排除select字段中的选项

Django表单排除select字段中的选项
EN

Stack Overflow用户
提问于 2015-01-12 21:20:48
回答 2查看 2K关注 0票数 0

我有一个模型,它有一个ManyToMany字段(让我们称之为“选项”)与另一个模型

当我创建ModelForm时,它会显示所有选项。

是否有任何方法排除某些选项值或只显示其中一些选项值?

下面是一个示例:

models.py

代码语言:javascript
复制
class Options (model.Models):
    name = ...
    ...

class Anything (model.Models):
    ...
    options = ManyToManyField(Options)

在我的数据库中“选项”的值:

代码语言:javascript
复制
["OK", 
"OK_2", 
"NOT_OK", 
"OK_3, 
"NOT_OK_2"]

假设,我只需要显示"OK“值,并隐藏或不显示"NOT_OK”值。

有什么方法可以用ModelForms来完成吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-13 02:25:32

当然,您可以使用表单或更常见的m2m来筛选相关模型上外键字段或ModelForm的查询集。

在表单级别这样做是有用的,因为过滤很可能基于业务逻辑,而业务逻辑并不适用于所有情况,因此比根据模型定义更灵活。

虽然您可以在定义表单字段时做到这一点,但最好是在表单被构造之后才这样做,因此它是在运行时而不是编译时发生的(我刚刚经历了一些有趣的情况,这给我带来了一些问题,但是这是Django的早期版本!)

下面的ModelForm将完成这项工作:

代码语言:javascript
复制
class AnythingForm(ModelForm):
    options = forms.MultipleChoiceField()

    def __init__(self, **kwargs):
        super(AnythingForm, self).__init__(self, **kwargs)
        self.fields['options'].queryset = Option.objects.filter({pass in your filters here...})

    class Meta:
        model = Anything
票数 2
EN

Stack Overflow用户

发布于 2015-01-12 21:45:36

可以将limit_choices_to参数传递给ManyToMany字段:

代码语言:javascript
复制
from django.db.models import Q

class Anything (models.Model):
    options = models.ManyToManyField(Options,
                                     limit_choices_to=Q(name__startswith='OK'))

在django 1.7中,如果选择列表需要动态更改,甚至可以使用传递一个可调用的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27910922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档