μλ νμΈμ!
μ§μ₯μμ λ¬Έμ λ₯Ό ν΄κ²°νλ μ€μ΄μκ³ κ°μ₯ κ΄μ©μ μΈ ν΄κ²° λ°©λ²μ΄ 무μμΈμ§ κΆκΈνμ΅λλ€. λͺ¨λΈμ μΈλ ν€μ λν μ¬λ¬ ModelMultipleChoiceFilter
νν° νλκ° μμ΅λλ€. URLμ κΈ°λ³Έ ν€λ₯Ό λ
ΈμΆνμ§ μκ³ CheckboxSelectMultiple
μμ ―μ μ¬μ©νλ λμ μΈλ ν€μ κ³ μ μμ±μΌλ‘ νν°λ§νλ λ°©λ²μ μμλ΄λ €κ³ ν©λλ€.
λ€μμ λ΄κ° μ§κΈ μ΄λ»κ² μ€μ νλμ§ λ³΄μ¬μ£Όλ μμ λλ€.
# app/models.py
from django.db import models
class Foo(models.Model):
prop = models.CharField(max_length=55, unique=True)
def __str__(self):
return self.name
class Bar(models.Model):
foo = models.ForeignKey(Foo, related_name="bars")
# app/filters.py
import django_filters
from app.models import Bar, Foo
class BarFilter(django_filters.FilterSet):
foo = django_filters.ModelMultipleChoiceFilter(
queryset=Foo.objects.all(),
widget=CheckboxSelectMultiple(),
label="Foo",
label_suffix="",
)
class Meta:
model = bar
fields = ['foo']
μ΄κ²μ 보기μμ μμ ν μ μλν©λλ€. νν°λ μ¬λ°λ₯Έ μμ ―μΌλ‘ μ¬λ°λ₯΄κ² μλνκ³ νν°λ§ν©λλ€. κ·Έλ¬λ urlμλ κΈ°λ³Έ ν€κ° μμΌλ―λ‘ μ΄ μμ μμλ /?foo=1
μ΄μ§λ§ pk λ
ΈμΆμ λ°©μ§νκ³ urlμ λ μ½κΈ° μ½κ² λ§λ€κΈ° μν΄ /?foo=<prop value>
λ₯Ό μ½μ΅λλ€.
Djangoμ λ€λ₯Έ κ³³μμ μλνλ κ²½ν₯μ΄ μκΈ° λλ¬Έμ μ΄μ κ°μ νλλ₯Ό μμ νλ €κ³ μλνμ΅λλ€.
# app/filters.py
...snip...
class Meta:
model = bar
fields = ['foo__prop']
μ΄λ κ² νλ©΄ URLμ΄ μνλ λλ‘ /?foo=<prop value>
μλ΅νμ§λ§ μ΄μ λ μμμ CheckboxSelectMultiple
λ₯Ό μ¬μ©νμ§ μμ΅λλ€. μμ±μ foo__prop
λ‘ λ§λ€κΈ°λ νμ§λ§ νΌ λ λλ§μ΄ μ¬μ ν μλͺ»λμμ΅λλ€.
λ΄κ° νλ €λ μΌμ΄ κ±°μ μλνλ κ²μ κ³ λ €ν λ μ§μλλ€λ λλμ΄ μμ§λ§ κ·Έκ²μ μ»λ λ°©λ²μ μ μμ§ λͺ»νλ κ² κ°μ΅λλ€. μ΄κ²μ΄ νμ¬ μ§μλλ λ²μλ₯Ό λ²μ΄λλ κ²½μ° μ΄λ₯Ό μ²λ¦¬νκΈ° μν΄ λλ§μ μμμ μμ±ν μ μμ΅λλ€. μ΄λ€ λμκ³Ό λ©μ§ νλ‘μ νΈμ λν΄ λλ¨ν κ°μ¬ν©λλ€!
νμΌ. μ’μ λ¬Έμ μ λλ€. μλ°ν λ§νλ©΄ μ¬μ©λ²μ κ΄ν μ§λ¬Έμ΄μ§λ§ μ μ 리ν΄μ μ½μ΄λ³΄λ μ¦κ²μ΅λλ€.
νν°μ λν field_name μΈμλ₯Ό 보μ
¨μ΅λκΉ?
https://django-filter.readthedocs.io/en/master/ref/filters.html
μ΄λ κ² νλ©΄ foo_propμ foo νν°μ λμμΌλ‘ μ¬μ©ν μ μμ΅λλ€.
λλ κ·Έκ²μ΄ μλνλ€κ³ μμν κ²μ λλ€ ... μλ§λ μμ ― λ±μμ μ ν μ¬νμ μ€μ ν΄μΌ ν κ²μ λλ€ (νμ§λ§ μ²λ¦¬ν΄μΌν©λλ€ ...)
μλ νμΈμ, μκ°μ λ΄μ΄ λ΅λ³ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
λΉμ μ λλ₯Ό μ¬λ°λ₯Έ κΈΈλ‘ μΈλνμ΅λλ€! μ΄μ μ΄κ²μ ꡬνν κΈ°νκ° μμκ³ field_name
μΈμλ₯Ό μ¬μ©νλ©΄ ν¨κ³Όκ° μμμ΅λλ€!
μμΌλ‘ μ΄ λ¬Έμ λ₯Ό μ½μ μ μλ μ¬λμ μν΄ μ½λκ° λμ¨ λλ΅μ μΈ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
# app/filters.py
...snip
class BarFilter(django_filters.FilterSet):
foo = django_filters.ModelMultipleChoiceFilter(
queryset=Foo.objects.all(),
field_name="foo__prop", # This lets us keep the url as "/?foo=<value>
to_field_name="prop",
widget=CheckboxSelectMultiple(),
label="Foo",
label_suffix="",
)
class Meta:
model = bar
fields = ['foo']
μ€λ λμμ μΈκΈν @carltongibson λ¬Έμμμ μ΄μ λν μ°Έμ‘°λ₯Ό μ°Ύμ μ μμ΅λλ€. νΉν ModelMultipleChoice νν°μ λν μΉμ μ μ°Έμ‘°νμμμ€.
μ΄μ¨λ μκ° λ΄μ λμμ£Όμ μ μ λ§ κ°μ¬ν©λλ€!
κ°λ μ. ν΄κ²°νμ ¨λ€λ λ€νμ λλ€. μ νμ΄μ!
μ νμ΄ ! κ³ λ§μ΅λλ€ !
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ, μκ°μ λ΄μ΄ λ΅λ³ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
λΉμ μ λλ₯Ό μ¬λ°λ₯Έ κΈΈλ‘ μΈλνμ΅λλ€! μ΄μ μ΄κ²μ ꡬνν κΈ°νκ° μμκ³
field_name
μΈμλ₯Ό μ¬μ©νλ©΄ ν¨κ³Όκ° μμμ΅λλ€!μμΌλ‘ μ΄ λ¬Έμ λ₯Ό μ½μ μ μλ μ¬λμ μν΄ μ½λκ° λμ¨ λλ΅μ μΈ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
μ€λ λμμ μΈκΈν @carltongibson λ¬Έμμμ μ΄μ λν μ°Έμ‘°λ₯Ό μ°Ύμ μ μμ΅λλ€. νΉν ModelMultipleChoice νν°μ λν μΉμ μ μ°Έμ‘°νμμμ€.
μ΄μ¨λ μκ° λ΄μ λμμ£Όμ μ μ λ§ κ°μ¬ν©λλ€!