如何使用 ModelForm 过滤 Django 表单中的值?

新手上路,请多包涵

我正在尝试使用 ModelForm 添加我的数据。它运行良好,除了 ForeignKey 下拉列表显示所有值,我只希望它显示与登录用户相关的值。

这是我的 ExcludedDate 模型,我要添加的记录:

 class ExcludedDate(models.Model):
    date = models.DateTimeField()
    reason = models.CharField(max_length=50)
    user = models.ForeignKey(User)
    category = models.ForeignKey(Category)
    recurring = models.ForeignKey(RecurringExclusion)

    def __unicode__(self):
        return self.reason

这是类别的模型,它是包含我想按用户限制的关系的表:

 class Category(models.Model):
    name = models.CharField(max_length=50)
    user = models.ForeignKey(User, unique=False)

    def __unicode__(self):
        return self.name

最后,表单代码:

 class ExcludedDateForm(ModelForm):

    class Meta:
        model = models.ExcludedDate
        exclude = ('user', 'recurring',)

如何让表单仅显示 category.user 等于登录用户的类别子集?

原文由 harwalan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

您可以在 init 中自定义表单

class ExcludedDateForm(ModelForm):
    class Meta:
        model = models.ExcludedDate
        exclude = ('user', 'recurring',)
    def __init__(self, user=None, **kwargs):
        super(ExcludedDateForm, self).__init__(**kwargs)
        if user:
            self.fields['category'].queryset = models.Category.objects.filter(user=user)

在视图中,在构建表单时,除了标准表单参数之外,您还将指定当前用户:

 form = ExcludedDateForm(user=request.user)

原文由 Botond Béres 发布,翻译遵循 CC BY-SA 2.5 许可协议

我知道这很旧;但它是第一个谷歌搜索结果之一,所以我想我会添加我发现的方法。

 class CustomModelFilter(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return "%s %s" % (obj.column1, obj.column2)

class CustomForm(ModelForm):
    model_to_filter = CustomModelFilter(queryset=CustomModel.objects.filter(active=1))

    class Meta:
        model = CustomModel
        fields = ['model_to_filter', 'field1', 'field2']

其中“model_to_filter”是“CustomModel”模型的 ForiegnKey

为什么我喜欢这种方法:在“CustomModelFilter”中,您还可以更改模型对象在创建的 ChoiceField 中显示的默认方式,就像我在上面所做的那样。

原文由 warath-coder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题