2012-08-04 4 views
0

을 verbose_name (즉 verbose from template-tag, iterate over field names, iterate through modelsfew, more ...)장고 : 루핑 또는 필드 이름의 반복과 내가 주위에 "관련/중복"대부분의 질문을 읽은 생각

불행하게도 저는 장고 n00b이기 때문에 손을 잡을 필요가 있습니다. 작동하지 않는 것처럼 보입니다. 단지

{% if data.first_name %} 
    First Name: {{ data.first_name }} 
{% endif %} 

위로 fourty 시간을 4 ~ 5 섹션

<!-- this in some section of the template --> 
First Name : . Joe 
Last Name : .. Blogs 

<!-- this in another section --> 
City: ....... Xanadu 
Country: ..... Mongolia 
Occupation: .. Programmer 

<!-- this in another section of the template --> 
Age: ......... 75 
Height: ...... 180 cm 
Eye color: .. red 

10 개 가능한 필드는 각 I 원하지 않는 : 여기가 HTML에서 원하는 결과입니다! : -/... 그래서 여기에 (대략) 내 시도입니다 :

model.py

class GenericPerson(models.Model): 
    first_name = models.CharField(_('First Name'), 
         max_length = 200, 
         help_text = _('What is your name?')) 

    last_name = models.CharField(_('Last Name'), 
         max_length = 200, 
         help_text = _('What is your name?')) 
    etc, etc ... 

    class Meta: 
     abstract = True 

class Person(GenericPerson):  
    age_in_years = models.PositiveIntegerField(_('Age'), 
       null = True, 
       blank = True, 
       help_text=_('When was you born?, mate')) 
    location = models.ForeignKey(GeographicalProfile, 
           verbose_name=_('geolocations'), 
           null = True, 
           blank = True) 

    height = ... etc, etc. 

views.py

... 
try: 
    person = Person.objects.filter(pk=product_id) 
except Person.DoesNotExist: 
    raise Http404 

generaldata = person.values('first_name', 
           'last_name', 
           etc, etc, 
          )[0] 
localdata = person.values('city', 
           'country', 
           etc, etc 
          )[0] 
physicaldata = person.values('age', 
           'height', 
           'eye_color', 
            etc, etc 
           )[0] 
extra_context[data] = generaldata 
extra_context[loc] = localdata 
extra_context[phys] = physicaldata 

return render_to_response(template_name, extra_context ,context_instance=RequestContext(request)) 

해당 뷰를 사용하여, 나는

을 할 수

template.html

{% for p in phys.items %} 
<ul> 
    {% if p.1 %} 
    <li>{{p.0}} : {{p.1}}</li> 
    {% endif %} 
</ul> 
{% endfor %} 

다른 섹션. 하지만이 필드는 age_in_years, eye_color (이름 대신)로 반환됩니다. 자, 위의 글에서, 그래서 지금 ...이 {{뭔가를 사용하는 맹목적으로 시도했다, 템플릿 {% 부하 person_extras의 %}에서로드,

from django import template 
register = template.Library() 

@register.filter 
def get_name(object): 
    return object._meta.verbose_name # put here whatever you would like to return 

register.tag('get_name', get_name) 

을 사용자 정의 템플릿 태그를 생성

'STR'개체가 어떤 속성 '_meta을'이없는

'목록'개체가 어떤 속성 '_meta을'이없는 : | 템플릿 도처 get_object_name}} ...하지만 이해없이 내 폭력은 저를 준다

'튜플'객체에는 att가 없습니다. ribute '_meta'

'DICT'개체 내가이 템플릿 태그를 사용합니까 어떤 속성 '_meta'

'ValuesQuerySet'개체가 어떤 속성 '_meta'그래서

가 없습니다를,이 없다? 또는 for-loop에서이 템플릿 태그를 사용하도록 내보기를 수정하려면 어떻게해야합니까? 당신이 person = Person.objects.filter(pk=product_id)QuerySetPeople의 객체를 반환합니다 호출하면

는 통찰력

답변

3

주셔서 감사합니다. 이을의 검색어에 이후에 values를 사용하는 경우 - 문서의 말에 - : - 오히려 모델 인스턴스 객체보다, 반복 가능으로 사용할 때 사전을 반환하는 검색어 세트의 서브 클래스

는 ValuesQuerySet를 돌려줍니다.

그래서 기본적으로 템플릿에 당신은 당신이 사전 개체 대신 작동하지 않습니다 Person 객체에 ._meta.verbose_name를 호출하려고, 템플릿 태그를 호출 할 때.

그럼 대신 일반 queryset을 템플릿에 전달한 다음 각 섹션 (일반, 로컬, 실제)에 표시 할 필드를 제한하고 템플릿 필터를 사용하여 도움을받을 수 있습니다. 그래서 뭔가 같은 : (당신이 알고있는) 객체의 필드를 통해 반복하는, 또는 자세한 이름을 얻기 위해 쉬운 방법이 없기 때문에

try: 
    people = Person.objects.filter(pk=product_id) 
except Person.DoesNotExist: 
    raise Http404 

extra_context = { 
    'people' : people, 
    'general_fieldnames' : ['first_name', 'last_name' ...], 
    'local_fieldnames' : ['age', 'weight' ...], 
    'physical_fieldnames' : ['age', 'height' ...], 
} 
return render_to_response(template_name, extra_context  
    ,context_instance=RequestContext(request)) 

하지만 문제가있다. 대신 우리는 우리의 physical_fieldnames리스트를 통해 반복 할 수 있으며, 객체에서 해당 필드를 얻고 필터를 사용하여 상세한 이름을 얻습니다. 템플릿

{% for person in people %} 
<h1>General</h1> 
<ul> 
{% for field_name in general_fieldnames %} 
    {{ person|get_verbose_name:field_name }} : {{ person|get_field_value:field_name }} 
{% endfor %} 
</ul> 
{% endfor %} 

... 
+0

에서

from django import template register = template.Library() @register.filter def get_field_value(obj, field_name): return getattr(obj, field_name, None) @register.filter def get_verbose_name(obj, field_name): return obj._meta.get_field(field_name).verbose_name register.tag('get_verbose_name', get_verbose_name) register.tag('get_field_value', get_field_value) 

지금은 명확한 설명 주셔서 감사합니다. 그것은 긴 꼬인 검색을 해결! 템플릿 코드를 편집하여 템플릿에서 호출하는 필터의 이름이 위에서 정의한 이름과 동일한 지 확인하고 필터링하는 "객체"가 루프 처리되는 것을 확인합니다. 건배 – Massagran