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').
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
.
Komentar yang paling membantu
Contoh kerja dengan perpustakaan terbaru: