Django过滤器基础填充器

2024-10-01 07:15:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用BaseInFilter。用户可以输入用逗号分隔的ID,如图所示。我想做一个验证器(或者调节用户的输入),这样用户就只能在这里输入整数了

enter image description here

如果用户输入字符,Django后端将抛出此错误。 error

我也试过:

class BaseIntegerFilter(filters.BaseInFilter, filters.NumberFilter):
    pass

class HardwareFilter(filters.FilterSet):
    queryset = Hardware
    serializer_class = HardwareSerializer
    id = filters.BaseIntegerFilter(field_name="id", label="Comma separated list of hardware IDs", help_text="Comma separated list of hardware IDs")

但是这个解决方案不再允许我在文本框中输入逗号

有人能帮忙吗?任何帮助都将受到感谢


Tags: of用户idids整数filtershardwarelist
1条回答
网友
1楼 · 发布于 2024-10-01 07:15:27

下面是一些关于用法的指导

使用filterset_classBaseInFilter

views.py:

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets

from my_app.filters import MyFilter
from my_app.models import MyModel
from my_app.serializers import MySerializer


class MyViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    filter_backends = [DjangoFilterBackend]
    filterset_class = MyFilter
    lookup_field = 'id'

filters.py:

from django_filters.rest_framework import BaseInFilter, FilterSet, NumberFilter

from my_app.models import MyModel


class _NumberInFilter(BaseInFilter, NumberFilter):
    pass


class MyFilter(FilterSet):
    id__in = _NumberInFilter(field_name='id', lookup_expr='in')

    class Meta:
        model = MyModel
        fields = '__all__'

HTTP请求(数字):

$ curl http://127.0.0.1:8000/my_app/my_view_set/?id__in=2,5,6
[{"id":5,"name":"Some name 5"},{"id":2,"name":"Some name 2"},{"id":6,"name":"Some name 6"}]
  • 请注意,查询参数中的查找是id__in,而不仅仅是id
  • ^这里使用了{}。为了便于访问,您还可以在浏览器、邮递员等中输入

HTTP请求(数字和字母):

$ curl http://127.0.0.1:8000/my_app/my_view_set/?id__in=2,5FD,6
{"id__in":["Enter a number."]}

使用filterset_fields

views.py:

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets

from my_app.models import MyModel
from my_app.serializers import MySerializer


class MyViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {'id': ['in']}
    lookup_field = 'id'

HTTP请求:

  • filterset_class相同

UI呈现错误

上面执行的HTTP请求是手动的,不使用djangorestframework提供的UI。在使用UI进行尝试时,我遇到了与您所述相同的问题:

But this solution doesn't allow me to input commas in the textbox anymore.

这与django_filters(发生在后端)提供的过滤机制无关,因为这是一个纯粹的前端问题,特别是表单验证

我做的一个手动解决方法是检查文本框(右键单击+检查),然后将HTML行从number更新为text。因此,来自:

<input type="number" name="id__in" step="any" id="id_id__in">

致:

<input type="text" name="id__in" step="any" id="id_id__in">

enter image description here

HTTP请求(数字): enter image description here

HTTP请求(数字和字母): enter image description here

您可能希望截取djangorestframeworkdjango_filters对HTML的实际呈现,以便干净地执行此操作

相关问题 更多 >