Django-filter: Filter untuk Django-Taggit (permintaan)

Dibuat pada 16 Agu 2016  ·  11Komentar  ·  Sumber: carltongibson/django-filter

Pergi dengan bintang, django-taggit hampir sama populernya dengan django-filter, dan saya percaya itu adalah solusi masuk untuk menandai di Django. Sudah ada sejak 2010, diperbarui secara berkala, dan memiliki beberapa kontributor reguler.

Apa pendapat Anda tentang filter django-taggit?

Yang paling dekat dengan ini adalah:

tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        to_field_name='name',
        conjoined=True,
        distinct=True,
        queryset=Tag.objects.all(),
    )

Tapi saya tidak bisa membuatnya peka huruf besar/kecil (filter untuk tag 'TeSt' harus mengembalikan hasil dengan tag 'test').

Komentar yang paling membantu

Contoh kerja dengan perpustakaan terbaru:

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

Semua 11 komentar

Bagaimana TaggitFilter akan berbeda dari ModelMultipleChoiceFilter ?

Juga, saya cukup yakin kita dapat menambahkan dukungan lookup_expr sini hanya dengan menggabungkan nama bidang dengan pencarian.

Dengan ModelMultipleChoiceFilter URL harus field_name=tag1&field_name=tag2 , tetapi mungkin ada sejumlah besar tag, membuat URL menjadi sangat panjang. Tidak ideal untuk URL yang dapat dibagikan, misalnya.

Tag diproses oleh django-taggit menggunakan seperangkat aturan , memungkinkan satu string untuk diteruskan berisi semua tag.

Bagaimanapun, lookup_expr dalam ModelMultipleChoiceFilter pasti akan sangat membantu!

Pandangan sekilas menunjukkan bahwa Anda seharusnya dapat menggunakan TagsField Taggit. Ini akan memberi Anda perilaku penguraian csv mereka.

class TagsFilter(CharFilter):
    field_class = taggit.forms.TagsField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')


class MyFilterSet(FilterSet):
    tags = TagsFilter(name='tags__name')

    class Meta:
        model = MyModel
GET http://localhost/api/my-model?tags=a,b,c,d

Peringatan di sini adalah bahwa ini menggunakan pencarian in , yang bukan merupakan solusi case-insensitive yang Anda cari.

Saya kurang lebih berkeinginan untuk tidak menambahkan filter khusus untuk Django Taggit, meskipun mungkin paket yang bagus.

Pada akhirnya membuat filter tingkat proyek tidak begitu sulit. Inti yang layak akan jauh. (Google sangat bagus untuk itu.)

Senang melihat permintaan tarik A+ jika ada yang muncul, tetapi singkatnya saya akan menutup ini karena di luar jangkauan.

OK cukup adil. Bagaimana dengan dukungan untuk lookup_expr di ModelMultipleChoiceFilter ?

@stantond Senang melihat PR. _Tunjukkan Cödz_

Saya berharap saya bisa - sayangnya saya bukan pengembang yang terampil, tetapi seorang PM yang meraba-raba!

+1

Contoh kerja dengan perpustakaan terbaru:

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

Gunakan bidang slug Tag alih-alih bidang name agar tidak peka huruf besar-kecil. Taggit huruf kecil siput secara default.

Perhatikan bahwa kami dapat memperluas solusi di https://github.com/carltongibson/django-filter/issues/460#issuecomment -507218839 dengan bidang khusus jika kami ingin mendukung filter dengan satu tag yang berisi satu atau lebih spasi putih.

from django import forms
from django.utils.translation import gettext as _

from taggit.utils import parse_tags


class TagField(forms.CharField):

    def clean(self, value):
        value = super().clean(value)

        if "," not in value and '"' not in value and value:
            return [value]

        try:
            return parse_tags(value)
        except ValueError:
            raise forms.ValidationError(
                _("Please provide a comma-separated list of tags.")
            )

Kode diekstrak dari taggit/forms.py .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat