Django-filter: μ™Έλž˜ ν‚€ λͺ¨λΈμ˜ μ†μ„±μœΌλ‘œ 필터링

에 λ§Œλ“  2019λ…„ 01μ›” 09일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: carltongibson/django-filter

μ•ˆλ…•ν•˜μ„Έμš”!

직μž₯μ—μ„œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ€‘μ΄μ—ˆκ³  κ°€μž₯ κ΄€μš©μ μΈ ν•΄κ²° 방법이 무엇인지 κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λΈμ˜ μ™Έλž˜ 킀에 λŒ€ν•œ μ—¬λŸ¬ 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 인수λ₯Ό μ‚¬μš©ν•˜λ©΄ νš¨κ³Όκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€!

μ•žμœΌλ‘œ 이 문제λ₯Ό 읽을 수 μžˆλŠ” μ‚¬λžŒμ„ μœ„ν•΄ μ½”λ“œκ°€ λ‚˜μ˜¨ λŒ€λž΅μ μΈ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

# 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 필터에 λŒ€ν•œ μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ–΄μ¨Œλ“  μ‹œκ°„ λ‚΄μ„œ λ„μ™€μ£Όμ…”μ„œ 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

λͺ¨λ“  4 λŒ“κΈ€

νžˆμ•Ό. 쒋은 λ¬Έμ œμž…λ‹ˆλ‹€. μ—„λ°€νžˆ λ§ν•˜λ©΄ μ‚¬μš©λ²•μ— κ΄€ν•œ μ§ˆλ¬Έμ΄μ§€λ§Œ 잘 μ •λ¦¬ν•΄μ„œ μ½μ–΄λ³΄λ‹ˆ μ¦κ²μŠ΅λ‹ˆλ‹€.

필터에 λŒ€ν•œ 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 필터에 λŒ€ν•œ μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ–΄μ¨Œλ“  μ‹œκ°„ λ‚΄μ„œ λ„μ™€μ£Όμ…”μ„œ 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

κ°λ…μž. ν•΄κ²°ν•˜μ…¨λ‹€λ‹ˆ λ‹€ν–‰μž…λ‹ˆλ‹€. 잘 ν–ˆμ–΄μš”!

잘 ν–ˆμ–΄ ! κ³ λ§™μŠ΅λ‹ˆλ‹€ !

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰