문제

뷰 내에서 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 작업을하고 싶지 않지만 템플릿 로직에 깊이있을 때까지 필요한지 알 수 없습니다.

다른 가능한 솔루션 :

  1. {% expru003Cexpression> ~처럼u003Cvar_name> %} 템플릿 태그가 있습니다 http://www.djangosnippets.org/snippets/9/ 표현식은 템플릿의 컨텍스트를 로컬 범위로하는 법적 파이썬 표현식입니다.

  2. 템플릿 프로세서를 변경하십시오. 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 모델 및 위에서 설명한 기술 중 일부는 유연하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top