Django 템플릿에서 쿼리 필터링을 수행하려면 어떻게해야합니까?
-
03-07-2019 - |
문제
뷰 내에서 Python 코드에 해당하는 객체 세트를 가져 오려면 Django 템플릿 내에서 필터링 된 쿼리를 수행해야합니다.
queryset = Modelclass.objects.filter(somekey=foo)
내 템플릿에서 나는하고 싶습니다
{% for object in data.somekey_set.FILTER %}
그러나 필터를 작성하는 방법을 찾을 수없는 것 같습니다.
해결책
당신은 이것을 할 수 없습니다, 그것은 디자인에 의한 것입니다. Django 프레임 워크 저자는 데이터 로직에서 프리젠 테이션 코드를 엄격하게 분리 할 의도했습니다. 필터링 모델은 데이터 로직이며 출력 HTML은 프리젠 테이션 로직입니다.
따라서 몇 가지 옵션이 있습니다. 가장 쉬운 것은 필터링을 수행 한 다음 결과를 전달하는 것입니다. render_to_response
. 또는 당신은 당신이 말할 수 있도록 모델에 메소드를 작성할 수 있습니다. {% for object in data.filtered_set %}
. 마지막으로,이 특정 경우에 나는 그것에 대해 조언 할 것입니다.
다른 팁
다음과 같은 추가 템플릿 태그를 추가합니다.
@register.filter
def in_category(things, category):
return things.filter(category=category)
그런 다음 할 수 있습니다.
{% for category in categories %}
{% for thing in things|in_category:category %}
{{ thing }}
{% endfor %}
{% endfor %}
이 문제를 정기적으로 수행하고 종종 "메소드 추가"솔루션을 사용합니다. 그러나 "메소드 추가"또는 "보기에서 계산"이 작동하지 않는 경우가 있습니다. 예를 들어 템플릿 조각을 캐싱하고 사소한 DB 계산이 필요할 때 생산할 때. 필요하지 않으면 DB 작업을하고 싶지 않지만 템플릿 로직에 깊이있을 때까지 필요한지 알 수 없습니다.
다른 가능한 솔루션 :
{% expru003Cexpression> ~처럼u003Cvar_name> %} 템플릿 태그가 있습니다 http://www.djangosnippets.org/snippets/9/ 표현식은 템플릿의 컨텍스트를 로컬 범위로하는 법적 파이썬 표현식입니다.
템플릿 프로세서를 변경하십시오. Jinja2 (http://jinja.pocoo.org/2/)는 Django 템플릿 언어와 거의 동일한 구문을 가지고 있지만 완전한 파이썬 전원을 사용할 수 있습니다. 또한 더 빠릅니다. 이 도매를 할 수 있거나 템플릿으로 사용하는 것을 제한 할 수 있습니다. 너 작업 중이지만 디자이너 관리 페이지에 Django의 "안전한"템플릿을 사용하십시오.
이것은 할당 태그로 해결할 수 있습니다.
from django import template
register = template.Library()
@register.assignment_tag
def query(qs, **kwargs):
""" template tag which allows queryset filtering. Usage:
{% query books author=author as mybooks %}
{% for book in mybooks %}
...
{% endfor %}
"""
return qs.filter(**kwargs)
다른 옵션은 항상 적용하려는 필터가있는 경우 사용자 정의 관리자 문제의 모델에서 필터를 항상 반환 된 결과에 적용합니다.
이것의 좋은 예는 a입니다 Event
모델, 모델에서 쿼리의 90%가 다음과 같은 것을 원할 것입니다. Event.objects.filter(date__gte=now)
, 즉, 당신은 일반적으로 관심이 있습니다 Events
다가오는 것입니다. 이것은 다음과 같습니다.
class EventManager(models.Manager):
def get_query_set(self):
now = datetime.now()
return super(EventManager,self).get_query_set().filter(date__gte=now)
그리고 모델에서 :
class Event(models.Model):
...
objects = EventManager()
그러나 다시, 이것은 동일한 필터를 Event
모델 및 위에서 설명한 기술 중 일부는 유연하지 않습니다.