php, java를 사용하다 djnago를 사용하면서 당면한 또 하나.
for문을 사용할 때 java나 php는 for(int i; i<arr.length; i++) 등의 식으로
for문 안에서 index로 배열에 접근할 수 있었다.
근데 django, python은 for문 사용시 for var in arr: 식으로 풀어나가니까 index로 어떻게 접근하지 싶었다.
(지금 하려던게 배열 여러개를 for문 돌려서 배열[i] , 배열2[i], 배열3[i]
이렇게 접근해서 각 배열의 같은 방번호의 value를 꺼내려고 했다.)
구글링 결과, for문을 한번에 쓸 수 있는 방법 발견.
django-multiforloop 설치 후 {% load multifor %}로 사용하면 된다던데 나는 계속 오류가 났다.
에러내용)
Traceback (most recent call last):
File "..................\django\template\defaulttags.py", line 1034, in find_library
return parser.libraries[name]
KeyError: 'multifor'
(참고 / https://pypi.org/project/django-multiforloop/ )
그래서 다른방법을 모색.
Custom_template을 만들었는데 해당 파일에 새 함수를 추가했다.
@register.filter(name='index_i')
def index_i(l, i):
try:
return l[i]
except:
return None
해당 배열의 인덱스를 꺼내는 방법을 찾기 위해 만든 커스텀 함수
{% if result.pr_file is not None%}
{% with result.pr_file|split:"," as files %}
{% with result.pr_crt_dt|split:"," as crt_dts %}
{% with result.estate_name|split:"," as estate_names %}
{% with result.pr_no|split:"," as pr_nos %}
{% for value in pr_nos|length|ranges %}
<div>
<span>{{crt_dts|index_i:value}}</span>
<span>{{estate_names|index_i:value}}</span>
<span>
<a onclick="fff('{{files|index_i:value}}')">버튼</a>
</span>
<span>
<a onclick="fff('{{pr_nos|index_i:value}}','{{result.req_no}}')">버튼2</a>
</span>
</div>
{% endfor %}
{% endwith %}
{% endwith %}
{% endwith %}
{% endwith %}
{% endif %}
배열의 길이 length를 구하고 range를 이용해서 각 배열의 갯수만큼 순서대로 방에 접근하도록 for문을 돌림
사실 이 방법이 최선인지는 모르겠으나, 일단 처음에 뭣도모르고 4중 for문을 돌리다 이건 아니겠다 싶은 마음에
소스코드를 줄여보았다.
참고사이트
https://stackoverflow.com/questions/13376576/how-can-i-use-a-variable-as-index-in-django-template