【问题标题】:ModelChoiceFilter on django-filterdjango-filter 上的 ModelChoiceFilter
【发布时间】:2021-04-03 19:37:55
【问题描述】:

我正在提高我的英语,请耐心等待。

我创建了一个 django-filter 类以在我的仪表板上使用,但 ModelChoiceField 下拉列表显示所有“colocador”对象,而不仅仅是与当前用户相关的对象

Colocador 是与另一个用户个人资料相关的用户个人资料

class Colocador(models.Model):
    user = models.OneToOneField(
        MyUser, on_delete=models.CASCADE, primary_key=True)
    work_for = models.ForeignKey(Dono, models.CASCADE, blank=True, null=True)

我有一个这样的模型

class Venda(models.Model):
    name = models.CharField(max_length=50, verbose_name='Nome')
    colocador = models.ForeignKey(
        Colocador, on_delete=models.CASCADE, verbose_name="Colocador")
    

在我的 filters.py 中

class VendaFilter(django_filters.FilterSet):
    foo
    colocador = django_filters.ModelChoiceFilter(
        queryset=Colocador.objects.filter(work_for=3))

    class Meta:
        model = Venda
        fields = ['search', 'status', 'colocador']

我将 work_for 硬编码为 3,但显然我不想要硬编码的值,我已经传递了实际用户并尝试了这个但不起作用

class VendaFilter(django_filters.FilterSet):
    search = django_filters.CharFilter(
        method='search_filter', label='Procurar')
    # colocador = django_filters.ModelChoiceFilter(
    #     queryset=Colocador.objects.filter(work_for=3))

    class Meta:
        model = Venda
        fields = ['search', 'status', 'colocador']

    def search_filter(self, queryset, name, value):
        return Venda.objects.filter(
            Q(name__icontains=value) | Q(phone_number__icontains=value) | Q(
                cpf__icontains=value) | Q(rg__icontains=value), colocador__in=self.colocadores)

    def __init__(self, user, *args, **kwargs):
        super(VendaFilter, self).__init__(*args, **kwargs)
        self.colocadores = Colocador.objects.filter(work_for=user)
        self.filters['colocador'] = django_filters.ModelChoiceFilter(
            queryset=Colocador.objects.filter(work_for=user))

下拉列表仅显示与用户相关的对象,但是当我提交过滤器时会引发此错误

raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'None' into field. Choices are: acertado, colocador, colocador_id, cpf, expiration_date, id, mercadoria, mercadoria_id, name, phone_number, rg, sale_date, status

那么,如何创建一个可以正常工作的 ModelChoiceFilter 并只显示与当前用户相关的对象。

【问题讨论】:

    标签: django django-filter


    【解决方案1】:

    如果有人在这里遇到同样的问题是解决方案

    def __init__(self, user, *args, **kwargs):
        super(VendaFilter, self).__init__(*args, **kwargs)
        self.colocadores = Colocador.objects.filter(work_for=user)
        self.filters['colocador'].queryset = Colocador.objects.filter(
            work_for=user)
    

    简单漂亮。

    【讨论】:

    • 非常被低估的评论。你救了我几个小时兄弟!非常感谢!
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2018-10-16
    • 2018-12-04
    • 2019-08-03
    • 2020-05-26
    • 1970-01-01
    • 2013-06-12
    • 2011-04-13
    相关资源
    最近更新 更多