首页 > 解决方案 > 具有多对多字段的自定义过滤器

问题描述

我收到一个错误,我的自定义过滤器基于如下所示的模型

class Order(models.Model):

    STATUS = (
            ('Pending', 'Pending'),
            ('Out for delivery', 'Out for delivery'),
            ('Delivered', 'Delivered'),
            )

    customer = models.ForeignKey(Customer, null=True, on_delete = models.SET_NULL)
    product = models.ForeignKey(Product, null=True, on_delete = models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)
    note = models.CharField(max_length=1000, null=True)
    b_address1 = models.CharField(max_length=1000, null=True)
    b_address2 = models.CharField(max_length=1000, null=True, blank=True, default='')
    b_city = models.CharField(max_length=1000, null=True)
    b_county = models.CharField(max_length=1000, null=True)
    b_post_code = models.CharField(max_length=1000, null=True)

    def __str__(self):
        return self.product.name

并在下面查看我的自定义过滤器


class OrderListFilter(django_filters.FilterSet):

    q2 = django_filters.CharFilter(method="my_custom_order_filter")

    class Meta:
        model = Order
        fields = ['q2']

    def my_custom_order_filter(self, queryset, name, value):
        return Order.objects.filter(
        Q(status__icontains=value)
        |Q(customer__icontains=value)
        |Q(product__icontains=value))

请参阅下面的我的views.py

def orderList(request):

    order_list = Order.objects.all().order_by('id')

    myFilter3 = OrderListFilter(request.GET, queryset=order_list)

    order_list = myFilter3.qs

    context = {'order_list':order_list, 'myFilter3':myFilter3}

    return render(request, 'accounts/customer_order_list.html', context)

另请参阅下面的模板


<div class="coolo">
    <div class="form-group col-md-5 mb-10" >
        <form method="get">

            {% csrf_token %}
            {{myFilter3.form | crispy}}

            <a class="btn btn-primary" name = 'new_order' href="" role="button">NEW</a>
     </div>
</div>

                <div class="card card-body">
                    <table class="table">
                        <tr>
                            <th>ID</th>
                            <th>Product Name</th>
              <th>Customer Name</th>
                            <th>Status</th>
                            <th>Edit Order</th>
                            <th>Delete Order</th>


                        </tr>

            {% for i in order_list %}

                            <tr>
                                <td>ABC{{i.id}}</td>
                                <td>{{i.product}} </td>
                                <td>{{i.customer}}</td>
                <td>{{i.status}}</td>

                                <td><a class="btn btn-sm btn-info" name= "edit_order" href="">Edit</a></td>
                                <td><a class="btn btn-sm btn-danger" href="">Delete</a></td>


                            </tr>

                            {% endfor %}

在我的模板中,我有基于我的订单模型的“订单”列表,并且在我的模板表单中,我想根据基于我的搜索表单的订单模型搜索我创建的实例。

但是我收到以下错误

FieldError at /customer_order_list/
Related Field got invalid lookup: icontains

我该如何解决这个问题?

标签: pythondjango-modelsdjango-formsdjango-viewsdjango-templates

解决方案


类 OrderListFilter(django_filters.FilterSet):

q2 = django_filters.CharFilter(method="my_custom_order_filter")

class Meta:
    model = Order
    fields = ['q2']

def my_custom_order_filter(self, queryset, name, value):
    return Order.objects.filter(
    Q(status__icontains=value)
    |Q(customer__first_name__icontains=value)
    |Q(customer__middle_name__icontains=value)
    |Q(customer__last_name__icontains=value)
    |Q(product__name__icontains=value))

推荐阅读