Django-filter: ์ดˆ๊ธฐ ๊ฐ’ ์ „๋‹ฌ

์— ๋งŒ๋“  2014๋…„ 08์›” 28์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: carltongibson/django-filter

๋ณ„๋„๋กœ ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์—ฌ ์–‘์‹์— ์ดˆ๊ธฐ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค(yadda๋Š” ์ž๋ฆฌ ํ‘œ์‹œ์ž ๊ฐ’์ž„).

#views.py
def operator_search(request):
    operators = Operator.objects.all()
    f = OperatorFilter(request.GET, initial={'operator_city':'yadda'}, queryset=Operator.objects.all())
    return render(request, 'vendors/operator_search.html', {'filter':f, 'operators':operators})
#forms.py
class OperatorFilter(django_filters.FilterSet):
     operator_city = django_filters.CharFilter(initial="yadda")
     class Meta:
         model = Operator

๋‘˜ ๋‹ค ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. django-filter๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์–‘์‹์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ChoiceField์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
empty_label=None, null_value=<default-value>, null_label=<default-label>

๋ชจ๋“  5 ๋Œ“๊ธ€

์ด๊ฒƒ๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Filter, FilterSet ๋ฐ Form ๊ฐœ์ฒด๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋ฐ”์ธ๋”ฉ๋œ ์–‘์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— initial์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. QueryDict๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๊ณ  ์ด๋ฅผ FilterSet์— ์ „๋‹ฌํ–ˆ์ง€๋งŒ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์ผ๋ถ€๋ฅผ ๊ฒŒ์‹œํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด ์‹œ์ ์—์„œ ์ผ์ข…์˜ ๋ง‰ํ˜€ ์žˆ๊ณ  ๋‚ด ์‚ฌ์šฉ์ž๋Š” ๊ฒ€์ƒ‰์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„ํ”„๊ฐ€๋‹ˆ์Šคํƒ„์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐ ์ง€์ณค์Šต๋‹ˆ๋‹ค. :)

์•ˆ๋…•ํ•˜์„ธ์š” @chromakey โ€” ์ €๋Š” ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋ฒ• ์งˆ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–‘์‹์˜ ๋ฐ์ดํ„ฐ๋Š” FilterSet์— ์ „๋‹ฌ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

initial = {'operator_city':'yadda'}
initial.update(request.GET)
f = OperatorFilter(initial, ...)

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”.

๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์ง€๋งŒ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์•Œ์•„๋‚ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(์ž์‹ ์˜ ์žฌ๋Ÿ‰์— ๋”ฐ๋ผ ์‚ฌ์šฉ).

 ####### WARNING: this is a hack to enable initial filter field selection in django-filters########
# Create a mutable QueryDict object, default is immutable
initial = QueryDict('active_study=True', mutable=True)
# QueryDict update works different than normal dictionary update. Refer to docs.
initial.update(request.GET)
# Place the hacked, mutable QueryDict to the FilterSet.
filter = StudyFilter(initial, queryset=Study.objects.all())

ChoiceField์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
empty_label=None, null_value=<default-value>, null_label=<default-label>

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰