2010-08-11 1 views
4

영어와 중국어의 두 가지 언어로 제품 정보를 제공 할 사이트를 만들고 있습니다.Django 템플릿의 여러 모델 필드의 값을 조건부로 표시하는 "가장 좋은"방법은 무엇입니까?

각 제품은 영어 이름이어야하며 중국 이름이 필요할 수도 있습니다.

제품 페이지를 요청할 때마다 request 개체를 검사하여 제품 이름을 영어 또는 중국어로 표시할지 여부를 결정합니다. 후자의 경우, 설정되면 중국 이름이 표시되고, 그렇지 않으면 영어 이름이 표시됩니다.

여기없는 정보 내 Product 모델의 단순화 된 버전이 제거입니다 :

class Product(models.Model): 
    english_name = models.CharField(max_length=100) 
    chinese_name = models.CharField(max_length=100, null=True, blank=True) 

    def name(self, language): 
     if language == 'Chinese' and self.chinese_name: 
      return self.chinese_name 
     else: 
      return self.english_name 

내 질문이 출력에 가장 깨끗한 방법은 템플릿 내에서 원하는 이름이 무엇입니까? name 메서드는 language 인수로 전달되어야하므로 호출 할 수 없으며 Django 템플릿은 인수없이 메서드 호출 만 지원합니다.

I 템플릿 내에서 논리를 사용하여 모든 일을하지만,이 우아한 거리가 멀다 수 :

@register.filter 
def name(product, language): 
    if language == 'Chinese' and product.chinese_name: 
     return product.chinese_name 
    else: 
     return product.english_name 

:

{% ifequal language 'Chinese' %} 
    {% firstof product.chinese_name product.english_name %} 
{% else %} 
    {{ product.english_name }} 
{% endifequal %} 

내가 교대 위의 논리를 포함하는 템플릿 필터를 작성할 수 사용하기 매우 편리합니다.

{{ product|name:language }} 

템플릿 필터를 만들면 작업이 완료되지만 나에게이 논리는 실제로 모델에 속합니다. 템플릿 필터 방식이 좋은 방법입니까, 아니면 동일한 결과를 얻을 수있는 "더 나은"방법이 있습니까?

내 질문이 다소 모호하다는 것을 알았습니다. 몇 가지 작업 솔루션이 있지만이 문제에 대한 "최상의"(best practice) 솔루션으로 간주되는 것이 무엇인지 알고 싶습니다.

답변

4

필터를 약간 변경하는 것은 어떻습니까?

@register.filter 
def name(product, language): 
    return product.name(language) 

필터가 통화를 래핑하는 방식입니다. 논리는 여전히 모델 내부에서 처리됩니다. 그냥 생각.

+0

이것은 좋은 접근 방법이고 사용하려는 방법입니다. –

+0

아주 좋은 개선. 고마워요, Manoj. – davidchambers

관련 문제